为什么 grep 打印出“没有这样的文件或目录”?

Dat*_*ist 5 macos grep find xargs

我尝试在工作目录下搜索包含某些特定文本的 MarkDown 文件,因此我使用了以下命令:

\n\n
find . -name "*.md"  | xargs grep "interpretation"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,虽然我得到了我需要的结果,但终端也打印出很多错误,如下所示:

\n\n
grep: Problem: No such file or directory\ngrep: Solving: No such file or directory\ngrep: with: No such file or directory\ngrep: Algorithms: No such file or directory\n\xe2\x80\xa6\xe2\x80\xa6\netc\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

我将我的解决方案写为下面的答案。

\n

Dat*_*ist 5

找到了!

\n\n

起初,我使用了此处-s建议的选项来抑制错误,但@Kelvin \'s 评论提醒我真正的原因是我的许多文件\'名称具有spaces.

\n\n

所以正确的命令是:

\n\n

$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find"(在操作系统 X 上)

\n\n

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

\n\n
\n

类 Unix 系统允许spaces在 \xef\xac\x81lenames 中嵌入(甚至换行符!)。xargs这会给为其他程序构造参数列表之类的程序带来问题。嵌入space将被视为分隔符,生成的命令会将每个空格分隔的单词解释为单独的参数。为了克服这个问题,\xef\xac\x81ndxarg允许可选地使用字符null作为参数分隔符。字符null在 ASCII 中被 de\xef\xac\x81ned 为由数字 0 表示的字符(例如,字符space在 ASCII 中被 de\xef\xac\x81ned 为由数字 32 表示的字符) )。\xef\xac\x81nd 命令提供了 action -print0,它产生null单独的输出,并且该xargs命令具有\xe2\x80\x93null选项,它接受null分离的输入。

\n
\n\n

\xe2\x80\x94\xe2\x80\x94 Linux 命令行:完整介绍作者:William E. Shots

\n\n

警告xargs:当您在 os x 上时,命令的空分隔选项是\xe2\x80\x930

\n\n
\n\n

更新于2017-05-27 22:58:48

\n\n

感谢@Sundeep,他建议我使用本身-exec的一个新功能\xef\xac\x81nd,而不是xargs.

\n\n

因此,使用它来搜索当前目录及其子目录中的文件:

\n\n
$ find . -type f -name "*.md" -exec grep "some-text-want-to-find" {} +\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n

find\'s -exec 命令中的 {} + 是什么意思?- Unix 和 Linux 堆栈交换

\n