名前に「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修飾子を追加します。