我需要一种在文件名中可能包含空格的文件列表上运行grep的方法。在没有空格的文件列表中,它非常简单直接。另外,我知道如何处理find和xargs文件名中的空格。我只是在寻找一种grep
与 -print0 命令一起使用的方法。
我正在寻找文件中的文本,而不是文件名中的文本...
这列出了所有文件:
find * -print 0 | xargs -0 -i{} echo {}
Run Code Online (Sandbox Code Playgroud)
但是说我必须在两者之间执行 grep (或其他一些命令)。
这列出了文件中包含“howdy doody”的文件:
find * | xargs grep -l "howdy doody" | xargs -i{} echo {}
Run Code Online (Sandbox Code Playgroud)
这不起作用,grep
不知道如何识别空终止行。我错过了grep
手册页中的某些内容吗?
find * -print0 | xargs grep -l "howdy doody" | xargs -0 -i{} echo {}
Run Code Online (Sandbox Code Playgroud)
qua*_*ote 15
您是在文件名中还是在文件中寻找“howdy doody”?
# find files with "howdy doody" in the filename
find * -name "*howdy doody*" -print0 | xargs -0 ...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您也可以直接从find
with运行您的命令-exec
。不同之处在于find -exec
每个找到的文件运行一次命令;xargs
将文件名添加到命令的末尾(最多系统限制),因此它运行命令的次数更少。您可以对此进行模拟xargs -n1
以强制xargs
每个输入仅运行一个命令。
# grep once per file
find * -exec grep -l "howdy doody" {} \; | ...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18217 次 |
最近记录: |