排除使 find 抱怨权限的路径

for*_*rin 6 permissions find

我需要从磁盘卷生成文件列表。一些目录(根目录下的所有隐藏目录)具有奇怪的权限,导致 find 抱怨。

我尝试排除所有这些路径,但一个目录仍然抱怨:

find . -type f -not -path './.*/*'
find: ./.DocumentRevisions-V100: Permission denied
Run Code Online (Sandbox Code Playgroud)

权限是这样的(由操作系统设置,所以我认为它们不应该被弄乱)。

d--x--x--x root  wheel   .DocumentRevisions-V100
Run Code Online (Sandbox Code Playgroud)

如何更改find语句以有效地省略所有隐藏目录,以免抱怨。(我不想这样做,2>/dev/null因为我想了解其他问题)。

Gil*_*il' 7

使用 GNU find 或任何其他支持-readable-executable谓词的find :

find . -type d ! \( -readable -executable \) -prune -o -type f -not -path './.*/*' -print
Run Code Online (Sandbox Code Playgroud)

首先,我们修剪不可遍历的目录。如果该条件不适用,请尝试其他条件。

如果您find没有这些选项,您可以匹配文件权限。

find . -type d ! -perm -u+rx -prune -o -type f ! -path './.*/*' -print
Run Code Online (Sandbox Code Playgroud)

  • `-perm -u+rx` 将检查其所有者(不一定是您)具有 rx 权限的目录。 (2认同)

msw*_*msw 3

find 的语法确实是一头奇怪的野兽。我认为你可能会成功

find . -path './.*' -prune -o -type f -print
Run Code Online (Sandbox Code Playgroud)

根据find(1) 手册页

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

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