为什么使用grep命令会输出"No such file or directory"?

5

我想在工作目录下搜索包含特定文本的MarkDown文件,所以我使用了以下命令:

find . -name "*.md"  | xargs grep "interpretation"

然而,虽然我得到了所需的结果,但终端也会输出许多类似下面的错误信息:

grep: Problem: No such file or directory
grep: Solving: No such file or directory
grep: with: No such file or directory
grep: Algorithms: No such file or directory
……
etc

我在下面写了我的解决方案。

1
如果您只想在当前目录中搜索文件而不进入子目录,请使用 grep 'interpretation' *.md... 如果您需要包括子目录,请改用 -type f-execfind 而不是 xargs。 - Sundeep
@Sundeep,谢谢您!我已经搜索了-exec的用法,它很方便!我会更新我的回答。我是一个命令行的新手,抱歉:) - DataAlchemist
使用命令行是一个永无止境的体验...如果您经常使用 find 命令,您可能想要将 https://unix.stackexchange.com/questions/321697/why-is-looping-over-finds-output-bad-practice 加入书签。 - Sundeep
2个回答

5

找到了!

起初我使用了-s选项来抑制错误,这是这里建议的,但@Kelvin的评论提醒我真正的原因是我的许多文件名中有空格

因此,正确的命令是:

$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find"(在os x上)

这里是我发现的一些更清晰的解释:

Unix-like系统允许在文件名中嵌入空格(甚至换行符!)。这对于像xargs这样为其他程序构建参数列表的程序会造成问题。嵌入的空格将被视为分隔符,导致生成的命令将把每个以空格分隔的单词解释为单独的参数。为了克服这个问题,find和xarg允许可选地使用null字符作为参数分隔符。在ASCII中,null字符定义为由数字零表示的字符(例如,与由数字32表示的空格字符相反)。find命令提供了“-print0”操作,它产生null分隔的输出,而xargs命令具有“-null”选项,它接受null分隔的输入。

警告:当您使用OS X操作系统时,xargs命令的空值分隔选项为-0


更新于2017年5月27日22:58:48

感谢@Sundeep建议我使用-exec,这是find本身的一个新功能,而不是xargs

因此,使用以下命令在当前目录及其子目录中搜索文件:

$ find . -type f -name "*.md" -exec grep "some-text-want-to-find" {} +

注意:

什么是在find的-exec命令中使用{} +的含义?- Unix&Linux Stack Exchange


1
我发现当存在符号链接且目标目录不存在时,它会打印出“没有这个文件或目录”的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接