关于使用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只能显示命中?
感谢。
答案 0 :(得分:7)
文件名包含空格,因此您需要告诉find
输出由NUL字节而不是换行符分隔的结果 - 请尝试以下操作:
find . -print0 | xargs -0 egrep 'Cache'
-0
到xargs
表示将STDIN中的数据解释为
由NUL字节分隔。 (这里不需要Cache
附近的单引号。)
类Unix系统上的许多工具同样具有生产或消费的选项
数据由NUL字节分隔,自0x00
和0x2F
(正斜杠)
是文件或目录中不允许的唯一两个字节
名称 - 这是安全处理带空格的文件名的常用方法
或换行。
作为最后一点,要非常挑剔,您可能希望将其更改为:
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