找到在文件名空间(find with spaces in filename)

2019-09-23 04:09发布

我经常使用grep两次发现,以搜索两种模式中的一个文件,如下所示:

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

然后,我遇到了文件与空间,当然这打破了上面的命令。 我修改了它如下处理的空间:

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

-print0告诉找到使用打印空作为分隔符,而不是空间和-0选项告诉xargs的期望空。 这只要作品因为没有我期待的有他们的道路空间的文件,但它打破了如果他们这样做。

所以,我需要的是一个标志,告诉grep的作为speartor,而不是换行打印空。

有任何想法吗?

Answer 1:

好问题。 你可以grep的-l用空值作为与Z选项的分隔符:

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

第一个解决方案是更好不过。



Answer 2:

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

如果您计划在以后的管顺序使用这些文件的名字,像你上面做变化-print-print0



Answer 3:

如果您使用GNU并行,而不是xargs的,那么你就可以避免在默认情况下分裂的换行,而不是白色的空间处理这一点,因为GNU并行。

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

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



Answer 4:

为了避免空间问题,我会使用新的行字符作为分隔符为-d选项xargs的:

xargs -d '\n' ...

对于两个独立的模式搜索我会使用egrep的:

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

所以我的完整的解决方案将是:

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


文章来源: find with spaces in filename