文件名中带有空格的查找

3

我经常使用带有find的grep两次来搜索文件中的两个模式,如下所示:

find . -name \*.xml | xargs grep -l "<beans" | xargs grep singleton

然后我遇到了含有空格的文件,这当然会破坏上述命令。我进行了以下修改来处理这些空格:

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs grep singleton

选项-print0告诉find使用null作为分隔符而不是空格,-0告诉xargs期望null。只要我正在寻找的文件路径中没有空格,这就起作用,但如果有空格,它就会出错。所以我需要一个标记来告诉grep将null打印为分隔符而不是换行符。你有什么想法吗?
4个回答

4

很好的问题。您可以通过使用Z选项使grep -l使用null作为分隔符:

find . -name \*.xml -print0 | xargs -0 grep -lZ "<beans" | xargs grep singleton

您还可以使用换行符作为分隔符让xargs工作。这对于以下情况也适用:
find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs "--delimiter=\n" grep singleton

第一种解决方案更好。

1

如果您使用GNU Parallel而不是xargs,则可以避免处理此问题,因为GNU Parallel默认会在换行符上拆分,而不是在空格上。

find . -name \*.xml | parallel grep -l "<beans" | parallel grep singleton

观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1
find . -name "*.xml"  -exec grep -q "<beans" {} \; -exec grep -q "singleton" {} \; -print

如果您计划在稍后的管道序列中使用这些文件名,就像上面所做的那样,请将-print更改为-print0


0
为了避免空格问题,我会使用换行符作为xargs的分隔符,并加上-d选项:
xargs -d '\n' ...

对于两个不同的模式搜索,我会使用egrep:

egrep '(pattern one|pattern two)' ...

那么我的完整解决方案是:

find . -name \*.xml | xargs -d '\n' egrep '(pattern one|pattern two)'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接