我试图找到名称中包含“支柱”(区分大小写)并且不包含“缓存”(也不区分大小写)的所有文件
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
特定 glob 的详细信息:
(#i)
:开启不区分大小写匹配^
: 否定全局运算符(...)
:分组(如@(...)
)ksh
。<something>#
:零个或多个<something>
(如*
正则表达式)。~
: and-not 运算符(匹配整个路径)**/
: 0 或更多目录级别(缩写为(*/)#
)。
(D)
如果您想要进入隐藏目录并匹配隐藏文件(如find
解决方案中所示),请添加glob 限定符。