xargs grep忽略不符合查询的文件

时间:2011-04-18 08:19:38

标签: bash unix grep xargs

关于使用xargs执行grep的快速问题。当我这样做时,我将显示一堆文件的结果,这些文件中不存在与成功匹配搜索条件的文件,例如:

find . | xargs grep 'Cache'

grep: PT: No such file or directory
grep: Sans: No such file or directory
grep: Free: No such file or directory
grep: Font: No such file or directory
grep: License.txt: No such file or directory

是否有可以传递的arg只能显示命中?

感谢。

4 个答案:

答案 0 :(得分:7)

文件名包含空格,因此您需要告诉find输出由NUL字节而不是换行符分隔的结果 - 请尝试以下操作:

find . -print0 | xargs -0 egrep 'Cache'

-0xargs表示将STDIN中的数据解释为 由NUL字节分隔。 (这里不需要Cache附近的单引号。)

类Unix系统上的许多工具同样具有生产或消费的选项 数据由NUL字节分隔,自0x000x2F(正斜杠) 是文件或目录中不允许的唯一两个字节 名称 - 这是安全处理带空格的文件名的常用方法 或换行。

作为最后一点,要非常挑剔,您可能希望将其更改为:

xargs -0 egrep Cache /dev/null

...这样你就可以确定grep总会有多个参数,并且你得到的输出始终以文件名为前缀。

答案 1 :(得分:1)

如果您有GNU grep,请将其设为递归

grep -R "Cache" *

答案 2 :(得分:1)

find . | xargs grep 'Cache' 2>/dev/null

答案 3 :(得分:0)

使用find with xargs时,应始终使用-print0,因为http://en.wikipedia.org/wiki/Xargs#The_separator_problem的分隔符问题。但是,如果你有一个文件列表,你可能想看看GNU Parallel:

find . | parallel grep Cache

观看介绍视频以了解详情:http://www.youtube.com/watch?v=OpaiGYxkSuQ