查找和否定 -iname 条件

Mat*_*teo 4 find

我正在尝试查找名称中包含“支柱”(案例激励)且不包含“缓存”(也不区分大小写)的所有文件

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)

我究竟做错了什么?

apa*_*aul 6

find您指定的选项适用于文件名,而不适用于子目录的名称。

在这里,您的文件名不包含cache但包含pillar,因此它匹配。

在您的情况下,您可能想要使用该-path选项。就像是:

find . -iname '*pillar*' -and -not -ipath '*cache*'
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 6

看起来您更希望避免在*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 限定符。