我试图在工作目录下搜索包含一些特定文本的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
我在下面写了我的解决方案。
答案 0 :(得分:2)
发现它!
首先,我使用选项-s
来抑制错误,由here建议,但@Kelvin的评论提醒我真正的原因是我的许多文件'名称包含spaces
。
所以正确的命令是:
$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find"
(在os x上)
我发现了一些更明确的解释:
类似Unix的系统允许在文件中嵌入spaces
(甚至换行!)。这会导致为xargs
等程序构建其他程序的参数列表时出现问题。嵌入的space
将被视为分隔符,结果命令将每个以空格分隔的单词解释为单独的参数。为了解决这个问题,find
和xarg
允许可选地使用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,他建议我使用-exec
,find
本身的新功能,而不是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