Answers:
好吧,与写到stdout的任何命令一起使用的通用情况是use xargs
,它将使您可以将任意数量的命令行参数附加到命令的末尾:
$ find … | xargs grep 'search'
或grep
使用反引号或将命令嵌入行中$()
,这将运行命令并替换其输出:
$ grep 'search' $(find …)
请注意,如果文件名包含空格或某些其他“怪异字符”(\'"
对于xargs,\[*?
对于$(find …)
),则这些命令不起作用。
但是,在特定情况下,find
可以根据给定参数执行程序是内置的:
$ find … -exec grep 'search' {} \;
-exec
和之间的所有内容都是;
要执行的命令;{}
被替换为的文件名find
。这将为grep
每个文件单独执行;因为grep
可以有许多的文件名和搜索所有这些,你可以改变;
,以+
告诉找到所有的匹配文件名传递给grep
一次:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
。QED。虽然-exec +
非常有效,但并非所有版本的find都存在。
$ find … -exec grep 'search' {} \+
形式是多是最快的。
某些版本grep
(例如在非嵌入式Linux或BSD或Mac OS X上)具有-r
进行递归搜索的选项。在OpenBSD上,使用-R
(--exclude
下面的示例中没有)。这涵盖了find
与的简单组合grep
。
如果您的实现没有该-R
标志,或者您希望使用更高级的文件匹配条件,则可以使用的-exec
主要值find
使其执行grep
。一些较旧的find
实现不支持-exec
… +
;在这些系统上,请使用;
而不是+
(这将对grep
每个文件调用一次,因此速度会较慢,但结果将相同)。请注意,即使碰巧在单个文件上被调用也要显示文件名的/dev/null
技巧grep
(GNU grep和FreeBSD / NetBSD / OSX grep可以-H
选择达到相同的效果)。
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grep
具有-H
始终打印文件名的选项。