使用带有管道和 & 符号的 grep 来过滤 find 中的错误

使用带有管道和 & 符号的 grep 来过滤 find 中的错误

我正在使用 cygwin 在 cygdrive 上查找文件。

但是我需要隐藏权限被拒绝的消息(否则结果会隐藏在错误消息中)。以下命令有效:

find -name 'myfile.*' |& grep -v "Permission denied"

我不明白为什么这个命令中需要加上“&”符号,本来以为它会起作用,但结果却不行。

find -name 'myfile.*' | grep -v "Permission denied"

请解释一下“&”符号的含义。

答案1

在类 Unix 系统中,有两个输出路径,如果不进行修改,则会将输出发送到屏幕。标准错误(或 stderr)是捕获大多数故障和错误情况的路径。

要将 stderr 中的权限被拒绝消息传递到与“常规输出”相同的输出流,您必须将两者结合起来。在您的示例中,为了grep -v正确操作它,您将 stdout(标准输出)和 stderr 与您所看到的神秘语法结合起来。

GNU Bash 手册部分3.2.2 管道

如果|&使用' ',命令1的标准错误,除了它的标准输出外,还连接到命令2通过管道将 的标准输入重定向到 ;它是 的简写2>&1 |。在命令指定的任何重定向之后,将标准错误隐式重定向到标准输出。

此外,正如 geirha 指出的那样,如果您只想摆脱 stderr 输出,您可能需要执行类似以下操作

find -name 'myfile.*' 2> /dev/null

也许

find -name 'myfile.*' 2> /tmp/errorlog

请注意,如果您有命令字符串,例如find将其输出传递给,xargs则需要将整个命令管道放在括号中,以捕获命令所有组件的输出。例如,

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

如果你省略括号,而是这样做——

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

您仍然会看到来自 find 或 egrep 的权限被拒绝错误,但 stderr 将被重定向到 xargs。

正如您所见,您可能只会在测试运行期间查看其内容后才会丢弃 stderr。

请注意,对于 GNUfind以及据我所知任何符合 POSIX 的find,该-print选项都是隐式的。如果您愿意,仍然可以显式提供它。

答案2

错误消息写入标准错误, 不是标准输出,但|仅限管道标准输出

你可能想要|&哪些管道标准错误标准输出

答案3

如果您想忽略错误消息,只需将 stderr 重定向到 /dev/null。

find . -name 'myfile.*' -print 2>/dev/null

另外,考虑阅读http://mywiki.wooledge.org/UsingFind

相关内容