跳过警告

跳过警告

我认为这会跳过包含“权限”的警告:

$ find / -iname "*mysql*" | grep -v "Permission"
find: /.DocumentRevisions-V100: Permission denied
find: /.fseventsd: Permission denied
find: /.Spotlight-V100: Permission denied
find: /.Trashes: Permission denied

但事实并非如此。有什么建议吗?

相比之下,这按预期工作:

$mkdir foo
$ls | grep -v "foo"

答案1

警告find显示在错误流、STDERR、文件描述符 2 上,但通过管道,您仅重定向 STDOUT(文件描述符 1)并使用grep它,因此消息仍然显示。

解决方案:

由于您对警告不感兴趣,只需将 STDERR 重定向到/dev/null

find / -iname "*mysql*" 2>/dev/null

如果必须使用grep,请传递 STDOUT 和 STDERR,然后使用命令grep -v "Permission"

如果您的 shell 支持|&

find / -iname "*mysql*" |& grep -v "Permission"

POSIX 风格:

find / -iname "*mysql*" 2>&1 | grep -v "Permission"

作为旁注,请查看警告的来源。可能存在权限问题,因为您可能以非 root 用户身份运行,要解决此问题,请运行命令findasroot或相应地限制您的搜索范围。

答案2

find与大多数其他实用程序一样,该实用程序将错误消息写入标准错误流

您的管道将重定向标准输出流findto grep,但错误流仍然会转到控制台。

要重定向 的错误流find,请使用2>&1grep这意味着“在普通输出所在的任何地方发送错误”):

find / -iname "*mysql*" 2>&1 | grep -v "Permission"

然而,既然你大概希望错误消失,使用

find / -iname "*mysql*" 2>/dev/null

这将使错误流find进入位桶/dev/null(一个永远无法填满的设备文件)。

答案3

警告不会被重定向。这将有助于:

find / -iname "*mysql*" 2>/dev/null | grep -v "Permission"

尽管你可能查看“权限”以外的警告:

find / -iname "*mysql*" 2>&1 | grep -v "Permission"

相关内容