我想找到所有包含“谁”、“什么”、“为什么”、“如何”、“何时”的文件。所有单词,顺序不限。不区分大小写
我试过:
grep -rl --include='*.adoc' "Who" . | xargs grep -l "What" | xargs grep -l "Why" | xargs grep -l "How" | xargs grep -l "When"
它给出的错误如下:
grep: Walkthrough/datatable/extras/Scroller/media/data/2500.adoc: No such file or directory
您遇到的问题是某些文件名包含空格。
xargs
会将其拆分为多个“文件名”。将
-0
选项添加到xargs
以使它们按 NUL 而不是空格进行分割,并将--null
or-Z
选项添加到grep
命令行以使其使用 NUL 而不是换行符。(但如果你想阅读输出,请省略--null
最后的......)。grep
所以把它们放在一起:或者,从文件名中删除空格和其他 shell 特殊字符。
否则,您的解决方案基本上是正确的,尽管 @James 的答案是正确的,您需要
-i
不区分大小写的选项。在slurp 模式下使用
find
GNU awk将整个文件作为单个记录和单词边界处理,相当于 grep 的/选项:\<
\>
-w
--word-regexp
尽管这似乎比通过多个 grep 进行管道传输要慢一个数量级 - 我猜缓存意味着多次 grep 同一文件的开销非常小。