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 上)。
如果您grep支持 GNU 的-Z/--null选项以空字节分隔文件名(FreeBSD 仅支持长--null变体),并且您xargs支持使用空字节作为输入项分隔符的-0选项(也有一些),您可以使用它们来处理文件名--null安全地:
grep -Ilri --null foo . | xargs -0 grep -i bar\nRun Code Online (Sandbox Code Playgroud)\n如果您的grep和xargsdon\xe2\x80\x99t 支持这些非标准选项(但话又说回来,两者都不-r是-I标准的),您可以使用find:
find . -type f -exec grep -Iiq foo {} \\; -exec grep -iq bar {} \\; -print\nRun Code Online (Sandbox Code Playgroud)\n它查找从当前目录开始的文件,对于找到的每个文件,运行grep以确定它是否包含 \xe2\x80\x9cfoo\xe2\x80\x9d,如果包含,则grep再次运行以确定它是否包含 \xe2 \x80\x9cbar\xe2\x80\x9d,如果存在,则打印其名称。
这虽然效率不高,但工作起来很安全。
\n