-iname条件の検索と否定

-iname条件の検索と否定

名前に「pillar」が含まれている(大文字と小文字が区別され)、「cache」が含まれていない(大文字と小文字が区別され)、すべてのファイルを検索しようとしています。

find . -iname '*pillar*' -and -not -iname '*cache*'

しかし、私が見つけたものとは異なる動作はありません。

./Caches/Metadata/Safari/History/https:%2F%2Fwww.google.ch%2Fsearch?q=pillars+of+eternity+dropbox&client=safari&rls=en&biw=1440&bih=726&ei=CnBDVbhXxulSnLaBwAk&start=10&sa=N%23.webhistory

私は何が間違っていましたか?

答え1

指定したオプションは、findサブディレクトリ名ではなくファイル名に適用されます。

ここでは、ファイル名にはcacheが含まれていないためpillar一致します。

あなたの場合は、このオプションを使用できます-path。それは次のとおりです。

find . -iname '*pillar*' -and -not -ipath '*cache*'

答え2

*cache*ディレクトリ内のファイルを探すのではなく、*pillar*名前に名前が含まれているかどうかを指定したいと思います。*cache*その後、ディレクトリfindに入らないように指示します。*cache*

find . -iname '*cache*' -prune -o -iname '*pillar*' -print

または以下を使用してzsh -o extendedglob

ls -ld -- (#i)(^*cache*/)#*pillar*

(報告書と厳密には同じではありませんfoo/pillar-cache

または(全体の木を下るので、それほど効率的ではありません。@apaulのソリューション):

ls -ld -- (#i)**/*pillar*~*cache*

特定のグローブのzsh詳細:

  • (#i):大文字と小文字を区別しない一致を有効にする
  • ^: グローバル演算子を無効化
  • (...):グループ(例@(...):)ksh
  • <something>#:0個以上<something>(例:*正規表現)
  • ~:and-not演算子(フルパスと一致)
  • **/:ゼロ以上のディレクトリレベル(略語で表示(*/)#)。

(D)隠しディレクトリに移動して隠しファイルを一致させるには(findソリューションに示すように)glob修飾子を追加します。

関連情報