3

关于使用 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

4 回答 4

7

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

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

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

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

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

xargs -0 egrep Cache /dev/null

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

于 2011-04-18T08:21:43.577 回答
1

如果你有 GNU grep,只需让它递归

grep -R "Cache" *
于 2011-04-18T09:49:05.720 回答
1
find . | xargs grep 'Cache' 2>/dev/null
于 2011-04-18T12:35:27.210 回答
0

将 find 与 xargs 一起使用时,您应该始终使用 -print0 因为http://en.wikipedia.org/wiki/Xargs#The_separator_problem的分隔符问题。但是,如果您有一个文件列表,每个文件都在一行上,您可能需要查看 GNU Parallel:

find . | parallel grep Cache

观看介绍视频以了解更多信息:http ://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-04-18T14:29:25.913 回答