我需要一种方法来运行grep在文件名中可能包含空格的文件列表中。在没有空格的文件列表中,这非常直接和容易。另外,我知道如何处理文件名中的空格寻找和参数。我只是在寻找一种grep
与 -print0 命令一起使用的方法。
我正在寻找文件内的文本,而不是文件名中的文本......
列出所有文件:
find * -print 0 | xargs -0 -i{} echo {}
但是说我必须在中间做一个 grep (或其他命令)。
以下列出了文件中包含“howdy doody”的文件:
find * | xargs grep -l "howdy doody" | xargs -i{} echo {}
这不起作用,grep
不知道如何识别以空字符结尾的行。我是否错过了grep
手册页中的某些内容?
find * -print0 | xargs grep -l "howdy doody" | xargs -0 -i{} echo {}
答案1
您是在文件名中还是在文件内寻找“howdy doody”?
# find files with "howdy doody" in the filename
find * -name "*howdy doody*" -print0 | xargs -0 ...
xargs
是您需要用来将以空字符结尾的输出从 中拆分出来的find -print0
。在您的示例中,echo
是多余的;不必理会它。
# find files containing "howdy doody"
find * -print0 | xargs -0 grep -l "howdy doody"
# find files containing "howdy doody" and do further processing
# multiple xargs version
find * -print0 | xargs -0 grep -l "howdy doody" | xargs -i{} do-something "{}"
# "sh -c" version
find * -print0 | xargs -0 -i{} sh -c 'grep -l "howdy doody" "{}" && do-something "{}"'
# notes:
# "sh -c" allows us to run a complex command with a single xargs
# "{}" handles spaces-in-filename
# handles any &&, ||, | command linking
find
您也可以直接从with运行命令-exec
。 不同之处在于,find -exec
为每个找到的文件运行一次命令;xargs
将文件名添加到命令末尾(最多为系统限制),因此运行命令的次数更少。 您可以使用 来模拟此操作,以xargs -n1
强制xargs
每个输入仅运行一个命令。
# grep once per file
find * -exec grep -l "howdy doody" {} \; | ...
答案2
-exec
您可以使用以下参数在一个命令中完成所有操作find
:
find . -name "*howdy doody*" -exec echo I found file {} hooray \;
执行命令末尾必须有转义的分号find
。
或者,如果您正在查看文件的内容:
grep -R "howdy doody" *
这将显示所有文本匹配项,添加-l
到 grep 以获取文件列表