命令`grep -Ilri foo 。| xargs grep -i bar` 仅当生成的路径没有空格时才有效

non*_*ity 4 grep bash xargs macos

要查找所有包含该单词的文件foo以及其中包含该单词的文件bar,我们可以使用

grep -Ilri foo . | xargs grep -i bar
Run Code Online (Sandbox Code Playgroud)

(不区分大小写并排除二进制文件)...但是,如果文件路径类似于

/Users/myusername/Text Files

那么它就不起作用了,因为现在该xargs部分变成了

grep -i bar /Users/myusername/Text Files
Run Code Online (Sandbox Code Playgroud)

但实际上它需要是

grep -i bar "/Users/myusername/Text Files"
Run Code Online (Sandbox Code Playgroud)

或者

grep -i bar /Users/myusername/Text\ Files
Run Code Online (Sandbox Code Playgroud)

如何让它发挥作用?(在 macOS Monterey 上)。

Ste*_*itt 6

如果您grep支持 GNU 的-Z/--null选项以空字节分隔文件名(FreeBSD 仅支持长--null变体),并且您xargs支持使用空字节作为输入项分隔符的-0选项(也有一些),您可以使用它们来处理文件名--null安全地:

\n
grep -Ilri --null foo . | xargs -0 grep -i bar\n
Run Code Online (Sandbox Code Playgroud)\n

如果您的grepxargsdon\xe2\x80\x99t 支持这些非标准选项(但话又说回来,两者都不-r-I标准的),您可以使用find

\n
find . -type f -exec grep -Iiq foo {} \\; -exec grep -iq bar {} \\; -print\n
Run Code Online (Sandbox Code Playgroud)\n

它查找从当前目录开始的文件,对于找到的每个文件,运行grep以确定它是否包含 \xe2\x80\x9cfoo\xe2\x80\x9d,如果包含,则grep再次运行以确定它是否包含 \xe2 \x80\x9cbar\xe2\x80\x9d,如果存在,则打印其名称。

\n

这虽然效率不高,但工作起来很安全。

\n