a1、a2、a3、b1、b2、b3 ファイルを含むディレクトリがあるとします。で始まりますa
が、含めずに一致させたいです3
。試しましたが一致しなかったにもls -I "*3" *a*
返されました。可能ですか?a1 a2 a3
a3
ls
答え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 -1
1行に1つのファイルを表示します。
grep
通常、パターンに一致する行を探しますが、この-v
動作は逆です。つまり、grepはパターンと一致しない行を探します。
答え4
前の回答からわかるように、次のように解決できます。エルエス。私にとって、この特定の質問は、あなたのソリューションがうまくいかない理由をある程度暗示しています。だからこれに遅れて貢献したいと思います。
もともと、
ls -I "*3" *a*
次に終わるすべての項目を除外する必要があります。サム、また、以下が含まれます。明らかにすべて含めるㅏ。実際、*ㅏ*シェルワイルドカードの使用と拡張今後実際のコマンドが実行されます。「*サム」このセクションで引用されているように)。したがって、あなたの命令はあなたの場合と同じです。
ls -I "*3" a1 a2 a3
だからアイテムが一覧表示されますa3。したがって、リストに明確に与えられた項目は、次に関連する拒否された項目です。-私。そこで私は結論を下します。暗黙的に受動的な意味で明示的に指定されていないすべて、例えば
ls -I "*3"
除外されますa3(ただし、このディレクトリで考慮される他の項目も表示されます。b1)。