当文件名有空格时,如何grep查询2个字符串的所有文件?

时间:2017-02-17 00:11:48

标签: bash command-line grep find csh

我需要查询同时包含字符串'rESTWSLib'和'500'的java文件。 两个字符串都可以在文档中的任何位置(即行),并且可以位于0-无限行(位置0-n)的任何位置。

如何grep查询'rESTWSLIB':

find -iname '*.java' -type f -exec grep -l "rESTWSLib" '{}' \; > ~/SMCrestwsList1.txt

输出:

./some/file1.java
./some/file2.java

如何grep查询'500':

find -iname '*.java' -type f -exec grep -l "500" '{}' \; > ~/SMCrestwsList2.txt

输出:

./some/file2.java
./some/file3.java

我需要结合两个grep查询(或其结果),所以我期待这样做:

./some/file2.java

我已尝试过How to grep query all files for 2 strings

中提供的解决方案
find -iname '*.java' -type f -exec grep -l "rESTWSLib" '{}' + | xargs grep -l "500" \; > ~/SMCrestwsList3.txt

但是,由于名称中只有少量文件有空格,因此只给出部分输出,并显示以下错误消息:

grep: ;: No such file or directory
grep: ./cdrm/bat/OpportunityManagement/Verify: No such file or directory

文件名是'验证某事'。

如何调整此项以接受文件名中的空格?

2 个答案:

答案 0 :(得分:1)

尝试使用正则表达式:

find -iname '*.java' -type f -exec grep -lzo "rESTWSLib.*500\|500.*rESTWSLib" '{}' \; > ~/SMCrestwsList1.txt

答案 1 :(得分:1)

要允许包含空格的文件名成功处理,您应该使用grep -Zxargs -0修改管道。这些匹配选项将grep更改为打印由\0字符分隔的文件名,并将xargs更改为预期以空值分隔的输入字符串。

find . -exec grep -lZ "expr_one" {} \+ | xargs -0 grep -l "expr_two"