命令行魔法:文件名中的空格与 find | | | 参数

Roy*_*ico 6 command-line

我需要一种在文件名中可能包含空格的文件列表上运行grep的方法。在没有空格的文件列表中,它非常简单直接。另外,我知道如何处理findxargs文件名中的空格。我只是在寻找一种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)

您也可以直接从findwith运行您的命令-exec。不同之处在于find -exec每个找到的文件运行一次命令;xargs将文件名添加到命令的末尾(最多系统限制),因此它运行命令的次数更少。您可以对此进行模拟xargs -n1以强制xargs每个输入仅运行一个命令。

# grep once per file
find * -exec grep -l "howdy doody" {} \; | ...
Run Code Online (Sandbox Code Playgroud)