将标准错误输出重定向到/dev/null。

119

我正在Unix服务器上使用以下命令:

find . -type f -name "*.txt" | xargs grep -li 'needle'

由于没有可用的grep -R,我必须使用这个find/xargs解决方案。每当无法打开文件时,grep会告诉我:

grep: 无法打开“foo.txt”

我想摆脱这个消息,所以我试图将stderr重定向到/dev/null,但不知何故这并不起作用。

find . -type f -name "*.txt" | xargs grep -li 'needle' 2>/dev/null

我想要保留stdout(即将结果写入控制台),只需隐藏这些grep错误消息。除了2>,我还尝试过&>,但也没有起作用。我该怎么解决?


1
你使用的是哪种Shell? - csl
1
是的,但那太不具体了。最好找到一个经典问题的候选人,并指向它(并投票或标记为重复)。 - Peter Mortensen
相关(尽管这是所有输出),来自2009年:*如何使用Bash抑制命令的所有输出?* - Peter Mortensen
2个回答

179
为了将stderr重定向到/dev/null,请使用:

redirect

some_cmd 2>/dev/null

你不需要在这里使用xargs。(而且你不希望使用它!因为它执行单词分割)
使用find命令的exec选项:
find . -type f -name "*.txt" -exec grep -li needle {} +

为了抑制错误信息,请使用grep-s选项:
来自man grep

-s,--no-messages 抑制有关不存在或不可读文件的错误消息。

这将给你:
find . -type f -name "*.txt" -exec grep -lis needle {} +

谢谢 @hek2mgl,那个解决方案完美地起作用了 :) 所有 grep 警告都没有了(无论是否使用 -s 标志)。而且我也不知道 -exec 的可能性。 - r0f1

21

只需将重定向移动到第一个命令,即

find ... 2>/dev/null | xargs ...

或者您可以将所有内容括在括号中:

(find ... | xargs ...) 2>/dev/null

谢谢,但这个也不起作用 :S(find . -type f -name“*.txt”| xargs grep -li'needle')2> / dev / null 括号放置不当。 find . -type f -name“*.txt”2> / dev / null | xargs grep -li'needle' 模糊的输出重定向。 - r0f1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接