递归 zgrep 不起作用

递归 zgrep 不起作用

我有一个包含大量.gz文件的目录层次结构。我希望能够以递归方式在其中查找字符串“foo”。从我在网上读到的内容来看,以下内容应该有效:

zgrep -R -H "foo" .

但是,这不会返回任何结果。如果我用文件的名称替换点,它确实有效。例如,

zgrep -R -H "foo" myFile.gz

然而,显然,这不再是递归的。

我知道“foo”存在于某些文件中,因为以下命令返回许多结果:

find . -iname "*.gz" | xargs zgrep "output" | less

有人知道为什么我的递归 zgrep 命令不起作用吗?我在 RHEL Linux 机器上

答案1

我通常的做法是:

zgrep "foo" $(find . -name "*.gz")

或者(但是,文件名将打印在每个结果之前,而不是每行之前——不仅仅是匹配的文件--):

find . -name "*.gz" -print -exec zgrep "foo" {} \;

如果该命令返回“参数列表太长”,请尝试以下方法:

for I in $(find . -name "*.gz"); do zgrep "foo" $I; done

答案2

您必须安装 zutils。这将用可递归的 zgrep 替换系统上默认且受限的 zgrep。

在基于 debian 的系统上apt-get install zutils,您可以运行zgrep -rH myword .并使用您熟悉和喜爱的 grep 中的大多数其他参数。

答案3

您快完成了。试试这个:

zgrep -R -H "foo" *.gz

编辑:嗯......有趣!

根据我的 zgrep,-R(递归)不是一个选项。它根本不受支持。我会检查一下你的 zgrep 的手册页上写了什么。

一个替代方法是,只依赖于一个级别的子目录,如下所示:

zcat */*.gz | grep <needle>

但我建议您的 find 命令可能更好!

答案4

它还适用于:

zgrep "foo" */*.gz

相关内容