我正在使用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”一词的每一行。