Unix 使用“grep”查找所有子目录中所有 gzip 文件中的字符串

Unix 使用“grep”查找所有子目录中所有 gzip 文件中的字符串

.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),-execfind 的参数将添加尽可能多的文件名(类似于xargs行为方式)。

答案4

以下作品zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

它也可能适用于bashksh等......

相关内容