ファイルa1、a2、a3、b1、b2、b3を含むディレクトリがあるとします。 a
で始まり、3
を含まないファイルのみを照合します。 ls -I "*3" *a*
を試しましたが、a1 a2 a3
と一致させたくないのに、a3
が返されます。これはls
で可能ですか?
ただ:
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
既存の回答は、グロブを使用してこれを行う最良の方法をよく述べています。これを含めます。ほとんどの場合、find
は、スクリプトを作成したり、さらに処理したりする場合に適しています。
$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2
答えをxargs
にフィードして簡単に操作したり、while read
より複雑なもののループ。
簡単な方法は
a*
に一致するすべてのファイルを一覧表示するには3
を含むすべての行を削除しますUNIXコマンドは
ls -1 a* | grep -v 3
ls -1
は、1行に1つのファイルを示します。
grep
は通常、パターンに一致する行を検索しますが、-v
ではこの動作が逆になります。つまり、grepはそのパターンに一致しない行を検索します。
zsh
では、~
glob演算子 を使用します。
setopt extendedglob
print -rl -- a*~*3*
gnu
ls
を使用すると、2つの--ignore
オプションを使用できます。
ls -I '[^a]*' -I '*3*'
1つ目はa
で始まらないすべてのファイル名を無視し、2つ目は3
を含むファイル名を無視します