排除查找中的目录

Yor*_*ubs 10 find

find每当我使用它时,对我来说总是一个完全的谜;我只是想/mnt从我的搜索中排除(我在 WSL 上的 Ubuntu 20.04 上的 bash 中,所以不希望它在 Windows 空间中搜索)下的所有内容,但find只是错误地进入这些目录,完全忽略了我。我从这个页面找到了语法。/sf/ask/294702971/并尝试了所有变体 - 全部失败。

\n
sudo find / -name \'git-credential-manager*\' -not -path \'/mnt/*\'\nsudo find / -name \'git-credential-manager*\' ! -path \'/mnt/*\'\nsudo find / -name \'git-credential-manager*\' ! -path \'*/mnt/*\'\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
find: \xe2\x80\x98/mnt/d/$RECYCLE.BIN/New folder\xe2\x80\x99: Permission denied\nfind: \xe2\x80\x98/mnt/d/$RECYCLE.BIN/S-1-5-18\xe2\x80\x99: Permission denied\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

ter*_*don 16

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

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

所以你要:

\n
sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

man find

\n
\n

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

\n
\n

所以:

\n
sudo find / -mount -name 'git-credential-manager*' \n
Run Code Online (Sandbox Code Playgroud)\n

  • @YorSubs 你不容易得到它是完全正常的!自 1998 年以来,我一直在工作和家庭中使用各种版本的 Linux 作为我的主要(唯一)操作系统,并且我大部分时间都花在命令行上。我_仍然_没有完全掌握“find”的所有复杂性。 (5认同)
  • “-mount”开关非常适合我。“find”手册页的唯一问题是它又长又复杂,但我猜“find”是一个相当复杂的应用程序。感谢您提供有用的选项,例如修剪等。 (2认同)
  • @terdon 想象一下开发它...... (2认同)

ilk*_*chu 11

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

GNU 手册页非常清楚地说明了在这里要做什么,请-prune改为使用:

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

find . -path ./src/emacs -prune -o -print
Run Code Online (Sandbox Code Playgroud)