我认为这会跳过包含“权限”的警告:
$ 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 用户身份运行,要解决此问题,请运行命令find
asroot
或相应地限制您的搜索范围。
答案2
find
与大多数其他实用程序一样,该实用程序将错误消息写入标准错误流。
您的管道将重定向标准输出流的find
to grep
,但错误流仍然会转到控制台。
要重定向 的错误流find
,请使用2>&1
(grep
这意味着“在普通输出所在的任何地方发送错误”):
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"