使用grep with pipe和&ers来过滤find中的错误

我正在使用cygwin在cygdrive上找到一个文件。

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

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

我不明白为什么需要将&符号放入此命令中,本来可以预期这会起作用,但事实并非如此。

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

请解释&符号的含义。

在类Unix系统中,有两个输出路径,如果保持未修改状态,则会将输出发送到屏幕。 标准错误(或stderr)是捕获大多数故障和错误条件的错误。

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

从GNU Bash手册第3.2.2节管道 :

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

另外,正如geirha指出的那样,如果你想摆脱stderr输出,你会想要做类似的事情

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

也许

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

请注意,如果您有命令字符串,例如将其输出传递给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。

请注意,使用GNU find ,据我所知,任何符合POSIX的find-print选项都是隐式的。 如果您愿意,您仍然可以明确地提供它。

错误消息写入stderr ,而不是stdout ,但是| 管道只有stdout

你可能想要|& , 它管stderrstdout

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

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

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