如何在查找中正确排除目录?

如何在查找中正确排除目录?

根据这个问题:如何排除查找中的目录,命令应该是这样的:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

但如果我这样做

find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print

这给出: find: paths must precede expression: ./.cache'

find: possible unquoted pattern after predicate -o'?

但我做了报价。

另外,-path选项后,路径应该是绝对路径还是相对路径?因为我已经包含了当前目录./[somefile],但是需要它吗-path

答案1

您错过了-path最后一个选项值前面的谓词"./.cache"

所使用的路径-path必须以 所使用的顶级搜索路径开头find。例如

  • find . -path './something/here'
  • find /etc -path '/etc/init.d'

*如果要匹配目录名称而不指定其在文件系统树中的位置,则可能需要使用通配符。此示例将匹配-type f目录下某处的所有文件 ( )wizard

  • find . -path '*/wizard/* -type f -print

答案2

对于未来的读者来说,符合 POSIX 标准的解决方案不遍历排除的目录,也不将它们包含在输出中有一般格式:

单一排除

find searchpath \! \( -path searchpath/excludepath -prune \)

多重排除

find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)

阻止这种遍历可以使巨大的当这些目录包含许多文件时,可以提高性能。从输出中完全省略排除的目录可以防止无意中对其进行操作。

可以放置更多过滤器和输出参数所有显示的内容,除了那些-maxdepth始终紧接在 后面的内容searchpath。的参数-path必须与该目录的输出相匹配find,并且通配符必须被转义/引用。


对于这个问题,解决方案是这样的(因为-print是默认的):

find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)

答案3

当我搜索信息以使 find 命令排除多个目录时,我来到此页面。我找到了答案沃尔夫最优雅的。根据我的实验,基于相同概念的变体是:

find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print

相关内容