私のディレクトリには多くのファイルが含まれており、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互換正規表現)という用語で)(幅なし)否定的な予測が必要です。