![递归搜索包含所有搜索字符串的txt文件](https://linux22.com/image/231290/%E9%80%92%E5%BD%92%E6%90%9C%E7%B4%A2%E5%8C%85%E5%90%AB%E6%89%80%E6%9C%89%E6%90%9C%E7%B4%A2%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84txt%E6%96%87%E4%BB%B6.png)
我想找到所有包含“谁”、“什么”、“为什么”、“如何”、“何时”的文件。所有单词,顺序不限。不区分大小写
我试过:
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
答案1
您遇到的问题是某些文件名包含空格。 xargs
会将其拆分为多个“文件名”。
将-0
选项添加到xargs
以使它们按 NUL 而不是空格进行分割,并将--null
or-Z
选项添加到grep
命令行以使其使用 NUL 而不是换行符。 (但如果你想阅读输出,请省略--null
最后的......)grep
或者,从文件名中删除空格和其他 shell 特殊字符。
否则,您的解决方案基本上是正确的,尽管 @James 的答案是正确的,您需要-i
不区分大小写的选项。
答案2
awk -v RS="" -v IGNORECASE=1 '/who/&&/how/&&/when/&&/what/{print FILENAME}' *
find . -type f -name "*.adoc" -exec awk -v RS="" -v IGNORECASE=1 '/who/&&/how/&&/when/&&/what/{print FILENAME}' {} +