web-dev-qa-db-ja.com

パターンに一致するファイルをリストしますが、別のパターンに一致するファイルは無視しますか?

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

12
Steven

ただ:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglobは拡張グロビングをアクティブにします。
  • aは最初のaと一致します
  • !()()... 内の一致を否定します
    • *3*は、3とその前後のあらゆるものです。

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

既存の回答は、グロブを使用してこれを行う最良の方法をよく述べています。これを含めます。ほとんどの場合、findは、スクリプトを作成したり、さらに処理したりする場合に適しています。

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

答えをxargsにフィードして簡単に操作したり、while readより複雑なもののループ。

8
Tom Hunt

簡単な方法は

  • a*に一致するすべてのファイルを一覧表示するには
  • 次に、3を含むすべての行を削除します

UNIXコマンドは

ls -1 a* | grep -v 3

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

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

4
Peter K

zshでは、~glob演算子 を使用します。

setopt extendedglob
print -rl -- a*~*3*

gnulsを使用すると、2つの--ignoreオプションを使用できます。

ls -I '[^a]*' -I '*3*'

1つ目はaで始まらないすべてのファイル名を無視し、2つ目は3を含むファイル名を無視します

3
don_crissti