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

问题描述 投票:0回答:13

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

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

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

grep
13个回答
401
投票

您可以使用

-s
--no-messages
标志来抑制错误。

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

grep pattern * -s -R -n

72
投票

如果您要查询 git 存储库,我建议您使用

git grep
。您不需要传入
-R
或路径。

git grep pattern

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


18
投票

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

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

6
投票

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

我通常不会在通过控制台执行系统管理任务时打扰,但在脚本中我确实使用“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 {} \;

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


4
投票

您尝试过

xargs
中的 -0 选项吗?像这样的东西:

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

3
投票

在 grep 中使用

-I

示例:

grep SEARCH_ME -Irs ~/logs


3
投票

我将

stderr
重定向到
stdout
,然后使用 grep 的反向匹配 (
-v
) 来排除我想要隐藏的警告/错误字符串:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"

0
投票

我在 Windows 上的 Emacs 中运行“M-x rgrep”时遇到了很多这样的错误,并且路径中有 /Git/usr/bin 。显然在这种情况下,M-x rgrep 使用“NUL”(Windows 空设备)而不是“/dev/null”。我通过将其添加到 .emacs 解决了这个问题:

;; Prevent issues with the Windows null device (NUL)
;; when using cygwin find with rgrep.
(defadvice grep-compute-defaults (around grep-compute-defaults-advice-null-device)
  "Use cygwin's /dev/null as the null-device."
  (let ((null-device "/dev/null"))
    ad-do-it))
(ad-activate 'grep-compute-defaults)

0
投票

使 grep 始终返回零状态的一种简单方法是使用

|| true

 → echo "Hello" | grep "This won't be found" || true

 → echo $?
   0

正如你所看到的,这里的输出值为0(成功)


0
投票

很多答案,但没有一个有效,叹气

 grep "nick-banner" *.html -R -n

它不起作用:

grep: *.html: No such file or directory

0
投票

问题:

这让我抓狂。我在(Google)太阳下尝试了所有方法,但没有任何效果与此

grep
有关,它只是在最终打印匹配之前重复出现有关“sysctl:读取密钥...”的错误:

sudo sysctl -a | grep vm.min_free_kbytes

解决方案:

没有任何效果,直到我顿悟:如果我在前面而不是后面进行过滤会怎么样?...是的:有效:

sysctl -a --ignore 2>/dev/null | grep vm.min_free_kbytes

结论:

显然,并非每个命令都会有

--ignore
开关,但这是我如何解决问题过滤问题的示例 BEFORE 我的
grep
。别太狭隘了,你追着尾巴去追求一些行不通的东西;-)


0
投票

@Teemu,你应该尝试接受的答案。 '-s' 工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.