![如何在查找中正确排除目录?](https://linux22.com/image/171054/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9F%A5%E6%89%BE%E4%B8%AD%E6%AD%A3%E7%A1%AE%E6%8E%92%E9%99%A4%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
根据这个问题:如何排除查找中的目录,命令应该是这样的:
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