Answers:
@Steve Weet快要出现了。使用/ dev / null作为附加参数是强制显示文件名的一种好方法(我要记住,谢谢Steve),但是它仍然为找到的每个文件运行exec -这是一个巨大的开销。
您希望尽可能少地运行zgrep,以最大程度地利用每次执行:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
将为zgrep提供尽可能多的args(文件名),并重复执行它,直到它使用了find
命令提供的所有文件为止。如果任何文件名或目录名中都有空格,使用-print0
和-0
选项可使它正常工作。
在Mac OS X上,无需xargs即可达到相同的效果:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
总是至少有匹配的行显示文件名,在GNU的grep。
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
所以像
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
一棵树,或者-r不起作用,将查找结果的输出通过管道传递xargs zgrep
/bin/zgrep: -r: option not supported
新安装的ubuntu系统。
xargs
改为使用。
@aioobe快要出现了。该命令可以完成任务,但不会告诉您文件名
以下内容也应该告诉您文件名:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
的添加/dev/null
将确保zgrep看到两个文件名,因此,如果找到字符串,它将为您显示文件名
编辑
进一步的研究表明,对于我的机器(OS / X)-exec
,find参数将添加尽可能多的文件名(类似于xargs
行为方式)。
find
,但大多数现代版本(例如,在基于Debian的发行版中)都是如此。
-H
总是显示,而不是与匹配线,在GNU的grep至少文件名,/dev/null
黑客攻击。