特定のパターンに一致するファイルを一覧表示し、他のパターンに一致するファイルを無視しますか?

特定のパターンに一致するファイルを一覧表示し、他のパターンに一致するファイルを無視しますか?

a1、a2、a3、b1、b2、b3 ファイルを含むディレクトリがあるとします。で始まりますaが、含めずに一致させたいです3。試しましたが一致しなかったにもls -I "*3" *a*返されました。可能ですか?a1 a2 a3a3ls

答え1

のみ:

shopt -s extglob failglob
ls -d a!(*3*)
  • shopt -s extglob拡張ワイルドカードを有効にします(ksh拡張演算子のサブセットを有効にします)。
  • failglob一致するものがない場合は、グローバルモードをそのままにする代わりにコマンドをキャンセルします。これがa!(*3*)なければ、呼び出したファイルに3
  • a試合開始a
  • !()()内の一致を否定します。
  • *3*これ3とその前後に来るすべて。

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls -d a!(*3*)
a1  a2  a2a  aa1  aa2

答え2

find既存の回答では、globを使用してこれを行う最善の方法をよく説明しています。ほとんどの場合、スクリプトや追加処理を実行したい場合はより良いオプションなので、これを含めます。

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

xargs単純なタスクに応答を提供したり、while readより複雑なタスクを処理するためにループに応答を提供したりできます。

答え3

簡単な方法は

  • 一致するすべてのファイルのリストa*
  • 次に、次を含むすべての行を削除します。3

Unix命令は

ls -1 a* | grep -v 3

ls -11行に1つのファイルを表示します。

grep通常、パターンに一致する行を探しますが、この-v動作は逆です。つまり、grepはパターンと一致しない行を探します。

答え4

前の回答からわかるように、次のように解決できます。エルエス。私にとって、この特定の質問は、あなたのソリューションがうまくいかない理由をある程度暗示しています。だからこれに遅れて貢献したいと思います。
もともと、

ls -I "*3" *a*

次に終わるすべての項目を除外する必要があります。サム、また、以下が含まれます。明らかにすべて含める。実際、*ㅏ*シェルワイルドカードの使用と拡張今後実際のコマンドが実行されます。「*サム」このセクションで引用されているように)。したがって、あなたの命令はあなたの場合と同じです。

ls -I "*3" a1 a2 a3

だからアイテムが一覧表示されますa3。したがって、リストに明確に与えられた項目は、次に関連する拒否された項目です。-私。そこで私は結論を下します。暗黙的に受動的な意味で明示的に指定されていないすべて、例えば

ls -I "*3"

除外されますa3(ただし、このディレクトリで考慮される他の項目も表示されます。b1)。

関連情報