当其中一些文件包含空格时,如何在一组文件中搜索字符串?

Dav*_*e A 4 unix grep find xargs macos

我正在运行 Mac 10.7.5。在终端中,我将使用此命令查找带有字符串的文件

find src/main -name "*" | xargs grep -i 'mystring'
Run Code Online (Sandbox Code Playgroud)

但是,当文件包含空格时,我会得到类似的结果

grep: images/mystuff/essential-questions-selected-arrow-ela: No such file or directory
grep: 5.24.38: No such file or directory
grep: PM.png: No such file or directory
Run Code Online (Sandbox Code Playgroud)

上面例子中的实际文件是“essential-questions-selected-arrow-ela 5.24.38 PM.png”即使被搜索的文件包含空格,我如何成功运行上述命令?

slh*_*hck 5

如果你想在 中使用find输出xargs推荐的方法是使用NUL字符来分隔每个文件名:

find src/main -name "*" -print0 | xargs -0 grep -i 'mystring'
Run Code Online (Sandbox Code Playgroud)

这样做的原因是外壳(xargs特别是)通常根据空格(即空格、制表符和换行符)拆分参数(或在 情况下的输入xargs)。使用-0,xargs将读取由 分隔的每个字段NUL,这是find -print0输出的内容。

这将在GNU工作findxargs以及包含在OS X版本的其他版本可能没有选择,因为它们不是在POSIX要求。


但话又说回来,这不是真的必要。该"*"名模式扩展到所有可能的名字。grep可以自己递归,所以只需要:

grep -ri 'mystring' src/main
Run Code Online (Sandbox Code Playgroud)

在 Bash 4(默认情况下不随 OS X 一起提供)中,您还可以.txt使用以下globstar选项进行递归通配,例如对所有文件:

shopt -s globstar
grep -i 'mystring' **/*.txt
Run Code Online (Sandbox Code Playgroud)