find コマンドでファイルが無視されました。

find コマンドでファイルが無視されました。

私のディレクトリには多くのファイルが含まれており、atmを起動していないファイルのみを表示したいと思います。

D:/elite/custom>find d:/elite/custom/test -print
d:/elite/custom/Test
d:/elite/custom/Test/001234.txt
d:/elite/custom/Test/abc123.txt
d:/elite/custom/Test/ATM001.txt
d:/elite/custom/Test/ATM002.txt
d:/elite/custom/Test/DEF111.rtf
d:/elite/custom/Test/wwww.txt
d:/elite/custom/Test/abc


D:/elite/custom>find d:/elite/custom/test -name "[!ATM]*" -print
d:/elite/custom/Test/001234.txt
d:/elite/custom/Test/DEF111.rtf
d:/elite/custom/Test/wwww.txt

なぜ受けなかったのですd:/elite/custom/Test/abc123.txtか?

答え1

パラメータが-name呼び出されます。模様、シェルの「ワイルドカード」(ワイルドカードなど)のように見えます。文法は、[!ATM]*あなたが考えているものとは非常に異なることを意味します。つまり、A、T、M以外の文字で始まる名前を意味します。

このパターンatm*(括弧なしで注意)は、「atm」で始まるすべての名前と一致します。持つパターンなしこれを否定し、名前の構文と一致させます。いいえ「atm」で始めましょう。しかし幸運にもfindには「!」一致を無効にする構文があります。 "-name" 引数の前の否定一致 (パターン内にない!): find . ! -name 'atm*'

答え2

なぜなら[!ATM]、あなたは(明らかに)それが意味すると思うことを意味しないからです。 「A、a、Tまたはa以外のすべての文字M」を意味します。

かなりさまざまな正規表現型をサポートしているようですfind。誰もが知っているわけではありませんが、あなたの使用に適した一致については楽観的ではありません。

(PCRE(perl互換正規表現)という用語で)(幅なし)否定的な予測が必要です。

関連情報