我怎么能让grep不打印出来';没有这样的文件或目录';错误?
我正在浏览git管理的一大堆代码,每当我进行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
> 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,您应该添加-print0find-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