如何让grep无法打印出“无此类文件或目录”错误?


215

我正在遍历由git管理的一大堆代码,每当执行grep时,我都会看到成堆的消息,形式如下:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

有什么办法可以使这些线消失吗?


1
这些天,我建议使用agackcgrep代替-它们比grep搜索代码存储库快/好得多。
lunixbochs 2014年

如果您遍历代码并希望避免使用特定目录,那么也许应该看看ack。它是可识别源代码的grep,因此将主动忽略此类VCS目录(以及vi和emacs备份,非源文件等)。
Brian Agnew

2
用户如何获取No such file or directory有关存在的文件和/或目录的消息?或者相反,如何grep *获取不存在的文件的名称?这是否是争用条件,其他一些进程在运行时会操纵目录树(创建,重命名和删除文件)grep
斯科特(Scott)

Answers:


299

您可以使用-s--no-messages标志来抑制错误。

-s,--no-messages抑制错误消息

grep pattern * -s -R -n

14
@Alex @Dogbert这确实回答了问题,但是'-s'可以掩盖问题,例如,当您将xargs与grep一起使用时。尝试在目录“ aaa.txt”和“ a b.txt”中创建2个文件,它们都包含字符串“ some text”。该命令/bin/ls -1 | xargs grep 'some text'将为您提供“没有这样的文件或目录”,因为它将“ a b.txt”分解为2个args。如果您抑制,您将不会注意到您错过了文件。
开尔文

@Kelvin做,例如,如果我使用find和使用print0xargs -0这是否解决了问题?谢谢
卢卡

1
@Luka那应该解决问题。如果始终使用这些NUL选项,就不会遇到问题,但是,如果不这样做,几乎可以保证(IMHO)您会在最不适当的时间忘记。
开尔文

这在Mac OS X上有效,而其他选项(--quiet)不起作用
philshem

59

如果您要遍历git存储库,建议您使用git grep。您不需要通过-R或路径。

git grep pattern

这将显示当前目录中的所有匹配项。


5
+1是有用的特定于git的命令。不会为svn工作:-)
cadrian 2011年

2
+1这是我一直缺少的git命令-这使我可以在任何提交中通过从树状态grep来获取字符串(通过在“ pattern”之后添加提交)。
开尔文

1
使用逃犯插件,Ggrep还可以从Git目录的顶部而不是当前目录开始搜索。
西罗Santilli郝海东冠状病六四事件法轮功

这似乎比标准grep快得多。(也许它忽略二进制文件等?不知道,但是有用。)
Daniel

10

通常将类似的错误发送到“标准错误”流,您可以将其通过管道传输到文件,也可以在大多数命令中消失:

grep pattern * -R -n 2>/dev/null

回答问题,但可以掩盖问题。请参阅我在Dogbert的回答下的评论。
开尔文

5

我已经看到这种情况发生了好几次,链接断开(指向不存在的文件的符号链接),grep尝试搜索不存在的目标文件(因此,正确而准确的错误消息)。

我通常不会在控制台上执行sysadmin任务,而是从脚本中查找带有“ find”的文本文件,然后grep每个文件:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

代替:

grep -nRHi -e "widehat" /etc

4

我通常不让grep自己做递归。通常有几个目录要跳过(.git,.svn ...)

您可以使用类似的姿态来创建巧妙的别名:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

乍一看似乎有些矫kill过正,但是当您需要过滤掉某些模式时,它非常方便。


1
+1。这远比抑制错误要好得多。但是,我认为您忘记了-execgrep之前的内容。
开尔文

1
这是什么意思?\( -name .svn -o -name .git \)
sbhatla '16

为什么不使用grep的--exclude或--exlcude-dir标志?
Choylton B. Higginbottom

1
@sbhatla括号为find命令创建了一个操作顺序。stackoverflow.com/questions/24338777/...
Choylton B. Higginbottom

4

您是否-0xargs中尝试过该选项?像这样:

ls -r1 | xargs -0 grep 'some text'

2
要查找,您应该添加-print0find -print0 | xargs -0 grep 'text'
aliva

1

-I在grep中使用。

范例:grep SEARCH_ME -Irs ~/logs


1
-I跳过二进制文件-等效于--binary-files=without-match。它不会抑制“没有这样的文件或目录”消息。
mwfearnley'8

0

我重定向stderrstdoutgrep的invert-match(-v),然后使用它来排除要隐藏的警告/错误字符串:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.