.gz
如何在所有目录和子目录中的所有文件中递归地查找字符串?
答案1
@Steve Weet 几乎完成了。使用 /dev/null 作为附加参数是强制显示文件名的好方法(我会记住的,谢谢 Steve),但它仍然会为找到的每个文件运行 exec —— 开销巨大。
您希望尽可能少地运行 zgrep,从而充分利用每次执行:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
将向 zgrep 提供尽可能多的参数(文件名),并重复执行它,直到它使用了命令提供的所有文件find
。使用-print0
和-0
选项允许它在文件或目录名称中有空格时工作。
在 Mac OS X 上,无需 xargs 即可达到相同的效果:
find . -iname '*.gz' -exec zgrep PATTERN {} +
答案2
$ 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 {} \
答案3
@aioobe 快完成了。该命令可以完成任务,但不会告诉您文件名
下面也会告诉您文件名:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
添加/dev/null
将确保 zgrep 看到两个文件名,因此如果它找到字符串,它将显示文件的名称
编辑
进一步的研究表明,对于我的机器(OS / X),-exec
find 的参数将添加尽可能多的文件名(类似于xargs
行为方式)。
答案4
以下作品zsh
for archive in **/*.gz; do
echo "[${archive}] "
gzip -dc ${archive} | grep -n "String"
done
它也可能适用于bash
、ksh
等......