命令行魔法:使用 find | grep | xargs 在文件名中添加空格

命令行魔法:使用 find | grep | xargs 在文件名中添加空格

我需要一种方法来运行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 以获取文件列表

相关内容