![命令行魔法:使用 find | grep | xargs 在文件名中添加空格](https://linux22.com/image/1224185/%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%AD%94%E6%B3%95%EF%BC%9A%E4%BD%BF%E7%94%A8%20find%20%7C%20grep%20%7C%20xargs%20%E5%9C%A8%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC.png)
我需要一种方法来运行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 以获取文件列表