我正在下面的目录树中搜索文件。当我尝试时find . -name xyz
,我得到了满屏的find: '/home/fred' : Permission denied
这是有道理的,因为我没有这些目录的访问权限。所以我尝试
find . -name xyz | grep -v Permission
这应该删除我不想要的行。嗯,我的屏幕和以前一模一样。 grep 不执行任何操作
这是怎么回事?我该如何解决?
答案1
“权限被拒绝”是一个警告,而不是您期望的那种数据find
。为了将错误消息与请求的用户数据分开,find
将文件名打印到其标准输出通道 1,并将警告打印到标准错误通道 2。这种行为在许多 UNIX 命令行工具中非常常见。 shell 通常显示两个通道。您可以通过显式地将错误流重定向到其他地方来避免它,例如由 表示的 void /dev/null
:
find . -name xyz 2>/dev/null
答案2
您的问题是您试图从 的标准输出中过滤(删除)错误消息find
。错误消息(以及一般诊断消息,以及交互式提示)显示在标准错误流上,无法通过管道传输。因此,您无法使用grep
(不将标准错误流合并到标准输出流中)来消除错误消息。
使用 GNU find
(实现非标准-readable
测试):
find . -type d ! -readable -prune -o -name xyz -print
这将查找xyz
当前目录中或当前目录下调用的任何内容,并打印出找到的路径名。每当find
遇到当前用户无权读取的目录时,就会将该目录从搜索树中删除(搜索树为修剪过的和-prune
)。
这消除了由于尝试访问您无法访问的目录而产生的“权限被拒绝”错误。它只是通过不进入会生成这些错误的情况来实现这一点。
通过避免grep
,这也将避免意外过滤掉在名为字面意思的目录中找到的文件,Permission
.它还可以让您看到任何其他搜索时可能生成的错误xyz
(无论这些错误可能是什么),或者编写内联脚本,通过find ... -exec ...
该脚本执行可能需要使用错误流,或者用于find ... -ok ...
在执行某些操作之前询问用户确认。