如何让grep不打印出"没有这样的文件或目录"错误?

Ale*_*lex 201 grep

我正在浏览由git管理的大量代码,每当我执行grep时,我都会看到一堆堆形式的消息:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么方法可以让这些线条消失吗?

Dog*_*ert 275

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

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

grep pattern * -s -R -n
Run Code Online (Sandbox Code Playgroud)

  • @Alex @Dogbert这确实回答了这个问题,但是'-s'可以掩盖问题,例如当你使用带有grep的xargs时.尝试在dir中创建2个文件,'aaa.txt'和'a b.txt',两个文件都包含字符串'some text'.命令`/ bin/ls -1 | xargs grep'some text'`会给你"没有这样的文件或目录",因为它将'a b.txt'分成2个args.如果你压制,你不会注意到你错过了一个文件. (13认同)
  • @Luka 这应该可以解决问题。如果你总是使用这些 NUL 选项,你不会遇到问题,但如果你不这样做,几乎可以保证(恕我直言)你会在最不合时宜的时候忘记。 (2认同)

Ste*_*ice 57

如果您正在浏览git存储库,我建议您使用git grep.您不需要传入-R或路径.

git grep pattern
Run Code Online (Sandbox Code Playgroud)

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

  • +1用于有用的git特定命令.虽然不适用于svn :-) (5认同)
  • +1这是我一直缺少的git命令 - 这让我可以在任何提交中从树的状态中获取一个字符串(通过在"pattern"之后添加提交). (2认同)

lun*_*chs 10

像这样的错误通常会发送到"标准错误"流,您可以将其传递给文件,或者只是在大多数命令上消失:

grep pattern * -R -n 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


cad*_*ian 5

我通常不让 grep 自己进行递归。通常有一些目录你想跳过(.git、.svn...)

你可以用这样的姿势来巧妙地别名:

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

乍一看似乎有点大材小用,但是当您需要过滤掉某些模式时,它非常方便。


cok*_*ude 5

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

ls -r1 | xargs -0 grep 'some text'
Run Code Online (Sandbox Code Playgroud)

  • 对于 find 你应该添加 -print0 `find -print0 | xargs -0 grep '文本'` (3认同)

小智 5

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

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

find /etc -type f -exec grep -nHi -e "widehat" {} \;
Run Code Online (Sandbox Code Playgroud)

代替:

grep -nRHi -e "widehat" /etc
Run Code Online (Sandbox Code Playgroud)