如何将文件列表传递给 grep

如何将文件列表传递给 grep

我正在使用find并获取我想要浏览的文件列表grep。我如何将该列表通过管道传输到grep

答案1

嗯,适用于任何写入 stdout 的命令的通用情况是使用xargs,它允许您将任意数量的命令行参数附加到命令的末尾:

$ find … | xargs grep 'search'

或者使用反引号或将命令嵌入到您的grep行中$(),这将运行该命令并替换其输出:

$ grep 'search' $(find …)

\'"请注意,如果文件名包含空格或某些其他“奇怪的字符”(对于 xargs、\[*?for $(find …)),这些命令将不起作用。


然而,在特定情况下,find根据给定参数执行程序的能力是内置的:

$ find … -exec grep 'search' {} \;

-exec和之间的所有内容;都是要执行的命令;{}替换为 找到的文件名find。这将为grep每个文件执行单独的操作;由于grep可以获取多个文件名并搜索所有文件名,因此您可以更改 to;来告诉 find立即+传递所有匹配的文件名:grep

$ find … -exec grep 'search' {} \+

答案2

某些版本的grep(例如在非嵌入式 Linux 或BSD或 Mac OS X)有一个-r选项可以进行递归搜索。在 OpenBSD 上,使用-R(并且没有--exclude如下例所示)。这涵盖了find和的简单组合grep

如果您的实现没有该-R标志,或者如果您想要更高级的文件匹配条件,则可以使用-exec主要的find来使其执行grep。一些较旧的find实现不支持-exec…… +;在这些系统上,使用 a;而不是 the +(这将grep每个文件调用一次,因此速度会更慢,但否则结果将是相同的)。请注意即使在单个文件上调用它也会显示文件名的/dev/null技巧(GNU grep 和 FreeBSD/NetBSD/OSX grep 有一个选项可以达到相同的效果)。grep-H

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

答案3

find ... | while read line; do grep <regex> "$line"; done

答案4

例子 :

搜索名称中包含“Delay”并且在找到的文件中某处包含“Create”的文件

find . | grep Delay | xargs grep 'Create'

然后,如果找到某些内容,它应该显示写有“Create”一词的每一行。

相关内容