ls -lrt | awk ' !/dly/ { print $NF } ' | awk ' /000001.txt.gz/ { print } '
次の条件に一致するファイル名を表示したい:1)「dly」キーワードを含めないでください。2)「000001.txt.gz」キーワードを含める必要があります。
上記のコマンドを使用しました。使用した2本のパイプを組み合わせることはできますか?
これはを使用しません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'
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 でそれを行う方法を覚えていません。