ls /directory | grep '[^term]' を実行したとき あなたは本質的に、文字 t e r m ではなく grep しています。これは、ファイルの名前に他の文字が含まれている場合でも、 ls の出力に表示されることを意味します .たとえば、次のディレクトリを見てください:
$ ls
alpha brave bravo charlie delta
ls |grep '^[brav]' を実行すると 以下を取得します:
$ ls |grep '^[brav]'
alpha
brave
bravo
ご覧のとおり、brave を取得しただけではありません と bravo alpha も取得しました 文字クラス [] のため そのリストから任意の文字を取得します。
したがって、 ls |grep '[^brav]' を実行すると 文字を含まないすべてのファイルを取得します b r a v どこでも
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
すべてのファイルに少なくとも 1 あるため、ディレクトリ リスト全体が含まれていることに気付いた場合 文字クラスに含まれていなかった文字。
Kanvuanza が言ったように、t e r m という文字ではなく、"term" の逆を grep するには grep -v を使用して行う必要があります .
例:
$ ls |grep -v 'brav'
alpha
charlie
delta
また、クラスに文字が含まれていないファイルが必要ない場合は、 grep -v '[term]' を使用します .これにより、これらの文字を含むファイルが表示されなくなります。 (カンヴァンザの答え)
例:
$ ls |grep -v '[brav]'
ご覧のとおり、このディレクトリ内のすべてのファイルにそのクラスの文字が少なくとも 1 つ含まれていたため、リストされたファイルはありませんでした。
補遺:
PCRE を使用すると、正規表現だけを使用して、否定式を使用して除外できることを付け加えたいと思います。これを行うには、否定先読み正規表現と呼ばれるものを使用します:(?!<regex>) .
したがって、上記の例を使用すると、 grep を使用せずに、次のようなことを行って必要な結果を得ることができます
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
その正規表現を分解するには、最初に ^ 行の先頭に一致します brav に一致しない文字列を探します 後を追うこと。 alphaのみ 、 charlie 、および delta 一致するので、それらだけが印刷されます。
grep -vだと思います フラグはあなたが望むことをします。マニュアルページから:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
ls /directory | grep -v [term] を使用できます 一致しない行を印刷します。