Linux 无法在管道中应用“查找”

Linux 无法在管道中应用“查找”

我正在下面的目录树中搜索文件。当我尝试时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 ...在执行某些操作之前询问用户确认。

相关内容