我怎么能让grep不打印出来';没有这样的文件或目录';错误?

我怎么能让grep不打印出来';没有这样的文件或目录';错误?,grep,Grep,我正在浏览git管理的一大堆代码,每当我进行grep时,我都会看到成堆的表单消息: > grep pattern * -R -n whatever/.git/svn: No such file or directory 我有没有办法让那些台词消失 您可以使用-s或--no messages标志来抑制错误 -s、 --无消息抑制错误消息 这样的错误通常会发送到“标准错误”流,您可以通过管道将其发送到文件,或者在大多数命令中使其消失: grep pattern * -R -n 2>/d

我正在浏览git管理的一大堆代码,每当我进行grep时,我都会看到成堆的表单消息:

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

我有没有办法让那些台词消失

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

-s、 --无消息抑制错误消息


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

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

如果您正在通过git存储库进行grepping,我建议您使用
git grep
。您不需要传入
-R
或路径

git grep pattern

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

我通常不让grep自己进行递归。通常有几个目录需要跳过(.git、.svn…)

你可以用这样的姿态做聪明的别名:

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

乍一看,这似乎有些过分,但当您需要过滤掉一些模式时,它非常方便。

您是否尝试过xargs中的
-0
选项?大概是这样的:

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

我见过这种情况发生过好几次,当链接断开(指向不存在的文件的符号链接)时,grep会尝试搜索不存在的目标文件(因此会出现正确、准确的错误消息)

在控制台上执行系统管理任务时,我通常不会费心,但在脚本中,我会查找带有“find”的文本文件,然后对每个文本文件进行grep:

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

grep -nRHi -e "widehat" /etc

在grep中使用
-I


示例:
grep SEARCH_ME-Irs~/logs
我将
stderr
重定向到
stdout
,然后使用grep的反向匹配(
-v
)排除我要隐藏的警告/错误字符串:

grep-r*2>&1 | grep-v“没有这样的文件或目录”

在我的路径中有/Git/usr/bin,在Windows上运行Emacs中的“M-x rgrep”时,我遇到了很多这样的错误。显然在那种情况下。我通过将此添加到.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)

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

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

 → echo $?
   0


如您所见,对于有用的git特定命令,这里的输出值为0(Success)

+1。但是对svn不起作用:-)+1这是我一直缺少的git命令-这让我可以在任何提交中从树的状态中grep一个字符串(通过在“模式”之后添加提交),
Ggrep
也从Git目录的顶部开始搜索,而不是从当前目录开始搜索。这似乎比标准grep要快得多。(也许它忽略了二进制文件等?不知道,但很有用。)@Alex@Dogbert这确实回答了这个问题,但是“-s”可以掩盖问题,例如,当你在grep中使用xargs时。尝试在目录“aaa.txt”和“a b.txt”中创建两个文件,这两个文件都包含字符串“some text”。命令
/bin/ls-1 | xargs grep'some text'
将为您提供“无此类文件或目录”,因为它将“a b.txt”分解为两个参数。如果您禁止,您不会注意到丢失了一个文件。@Kelvin会注意到,例如,如果我使用
find
并将
print0
xargs-0
一起使用,这能解决问题吗?Thanks@Luka这应该可以解决问题。如果你总是使用那些NUL选项,你不会遇到问题,但如果你不这样做,几乎可以保证(IMHO)你会在最不合时宜的时候忘记。这在Mac OS X上是有效的,而其他选项(--quiet)可以做到这一点not@Luka如果使用find,则可以省略xargs并在find中使用-exec(如果你需要shell工具,你可以用你最喜欢的shell来包装你的命令)+1。这比抑制错误要好得多。但是,我认为你忘记了grep之前的
-exec
。这是什么意思?
\(-name.svn-o-name.git\)
为什么不使用grep的--exclude或--exlcude dir标志?@sbhatla括号为find命令创建了一个操作顺序。回答了这个问题,但可以掩盖问题。请参阅我在Dogbert的答案下的评论。对于find,您应该添加-print0
find-print0 | xargs-0 grep'text'
最近我建议使用
ag
ack
,或者
cgrep
,它们比
grep
搜索代码存储库快得多。如果你在代码中搜索并避开特定目录,也许你应该查看ack。它是一个源代码感知的grep,因此会主动忽略这些VCS目录(以及vi和emacs备份、非源文件等)。对于存在的文件和/或目录,用户如何获得
没有此类文件或目录的消息? 或者,反过来说,
grep *是否正在获取不存在的文件名? 这是一种竞争条件吗?当
grep
运行时,其他进程操纵目录树(创建、重命名和删除文件)?
-I
跳过二进制文件-相当于
--binary files=不匹配
。但它不会抑制“没有这样的文件或目录”消息。
 → echo "Hello" | grep "This won't be found" || true

 → echo $?
   0