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

时间:2017-05-27 13:12:46

标签: macos grep find xargs

我试图在工作目录下搜索包含一些特定文本的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 个答案:

答案 0 :(得分:2)

发现它!

首先,我使用选项-s来抑制错误,由here建议,但@Kelvin的评论提醒我真正的原因是我的许多文件'名称包含spaces

所以正确的命令是:

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

我发现了一些更明确的解释:

  类似Unix的系统允许在文件中嵌入spaces(甚至换行!)。这会导致为xargs等程序构建其他程序的参数列表时出现问题。嵌入的space将被视为分隔符,结果命令将每个以空格分隔的单词解释为单独的参数。为了解决这个问题,findxarg允许可选地使用null字符作为参数分隔符。 null字符在ASCII中定义为由数字零表示的字符(与例如space字符相反,后者在ASCII中定义为由数字32表示的字符)。 fi nd命令提供操作-print0,它产生null分隔输出,xargs命令具有–null选项,接受null分隔输入。< / p>

- Linux命令行:William E. Shotts的完整介绍

警告:当您使用os x时,xargs命令的空分隔选项为–0

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

感谢@Sundeep,他建议我使用-execfind本身的新功能,而不是xargs

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

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

注意:

What is meaning of {} + in find's -exec command? - Unix & Linux Stack Exchange