我正在尝试查找名称中包含“支柱”(案例激励)且不包含“缓存”(也不区分大小写)的所有文件
find . -iname '*pillar*' -and -not -iname '*cache*'
Run Code Online (Sandbox Code Playgroud)
但它不像我发现的那样工作(除其他外)
./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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
find
您指定的选项适用于文件名,而不适用于子目录的名称。
在这里,您的文件名不包含cache
但包含pillar
,因此它匹配。
在您的情况下,您可能想要使用该-path
选项。就像是:
find . -iname '*pillar*' -and -not -ipath '*cache*'
Run Code Online (Sandbox Code Playgroud)
看起来您更希望避免在*cache*
目录中查找文件,*pillar*
而不是查找包含*cache*
名称和不包含名称的文件。然后,告诉find
不要打扰进入*cache*
目录:
find . -iname '*cache*' -prune -o -iname '*pillar*' -print
Run Code Online (Sandbox Code Playgroud)
或与zsh -o extendedglob
:
ls -ld -- (#i)(^*cache*/)#*pillar*
Run Code Online (Sandbox Code Playgroud)
(不严格等同于报告foo/pillar-cache
文件)
或者(效率较低,因为它像@apaul 的解决方案一样沿着整棵树下降):
ls -ld -- (#i)**/*pillar*~*cache*
Run Code Online (Sandbox Code Playgroud)
有关zsh
特定 glob 的详细信息:
(#i)
: 打开不区分大小写的匹配^
: 否定全局运算符(...)
:分组(如@(...)
在ksh
)。<something>#
: 零个或多个<something>
(如*
在正则表达式中)。~
: and-not 运算符(匹配整个路径)**/
: 0 或更多目录级别(简称(*/)#
)。(D)
如果您想进入隐藏目录并匹配find
解决方案中的隐藏文件,请添加glob 限定符。