查找并否定 -iname 条件

查找并否定 -iname 条件

我试图找到名称中包含“支柱”(区分大小写)并且不包含“缓存”(也不区分大小写)的所有文件

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 限定符。

相关内容