3

ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '

次の条件に一致するファイル名を表示したい:1)「dly」キーワードを含めないでください。2)「000001.txt.gz」キーワードを含める必要があります。

上記のコマンドを使用しました。使用した2本のパイプを組み合わせることはできますか?

4

3 に答える 3

4

これはを使用しませんawkが、パイプの数を減らします。

find -name "*dly*" -o -name "*000001.txt.gz*" -exec basename {} \;

編集:Zackによって提案された変更を追加しました(GNUの場合find

find -maxdepth 1 -name "*dly*" -o -name "*000001.txt.gz*" -printf '%f\n'
于 2012-10-23T14:48:42.250 に答える
2

awkほとんどの場合、C 式であるかのように条件を組み合わせることができます。

ls -lrt | awk '/000001\.txt\.gz/ && !/dly/ { print $NF }'

動作するはずです。(まったくテストされていません。)ただし、通常とは異なるもの (ファイル名のスペースなど) に対する効率と堅牢性が必要な場合は、代わりに次のようにする必要があります。

ls -1rt | awk '/000001\.txt\.gz/ && !/dly/ { print }'

ファイル名に改行が含まれていない限り、これは信頼できます。(文字ではなく、カーネルは文字エンコーディングを認識しない唯一のバイト値は、パス名コンポーネントに表示できない 0x2F と 0x00 ですが、通常、必要なスクリプトを作成していない限り、これについて心配する必要はありません。悪意のあるファイル名を処理します。) 別の代替手段は、次のことができるより強力な言語に到達することです。opendir

perl -le 'opendir(my $dh, ".") or die;
          print for sort grep { /00001\.txt\.gz/ && !/dly/ } readdir $dh'

またはより簡潔に(ただし効率は低くなります)

perl -le 'print for sort grep { /00001\.txt\.gz/ && !/dly/ } glob("*")'

ただし、これはそうではありませんls -rt。Perl でそれを行う方法を覚えていません。

于 2012-10-23T14:06:16.590 に答える