排除查找中的目录

排除查找中的目录

find每当我使用它时,对我来说总是一个完全的谜;我只是想/mnt从我的搜索中排除(我在 WSL 上的 Ubuntu 20.04 上的 bash 中,所以不希望它在 Windows 空间中搜索)下的所有内容,但find只是错误地进入这些目录,完全忽略了我。我从这个页面找到了语法。https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-command并尝试了所有的变化 - 都失败了。

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

当我这样做时,它只是犯了错误/mnt并抛出错误(这确实令人沮丧,因为上面的语法看起来很清晰,并且 stackoverflow 页面语法似乎是正确的):

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

有人可以告诉我如何停止find忽略我的目录排除开关吗?

答案1

Find-path不排除路径,这意味着“不报告名称与此路径匹配的任何匹配项”。它仍然会下降到目录中并搜索它们。你想要的是-prune(来自man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

所以你要:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

-mount虽然,根据您试图排除的内容,使用(GNU find)或-xdev(其他)可能更容易:

man find

-mount不要降级其他文件系统上的目录。的替代名称-xdev,用于与 find 的某些其他版本兼容。

所以:

sudo find / -mount -name 'git-credential-manager*' 

答案2

它不会忽略该选项。谓词-path针对遇到的每个文件进行评估,对于该树中的文件,它只是失败。它不会影响find目录树的行走方式,并且您可以拥有类似的东西find . ! -path "./foo/*" -o -name '*.txt',可以匹配外部的所有内容,但也可以匹配其中的foo文件。*.txt

GNU 手册页在这里做什么相当清楚,请-prune改为使用:

-path pattern
...要忽略整个目录树,请使用-prune而不是检查树中的每个文件。例如,要跳过目录src/emacs及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:

find . -path ./src/emacs -prune -o -print

相关内容