我有一个包含大量.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