在多个zip文件中搜索字符串


22

我正在使用SunOS 5.10。我有一个包含约200个zip文件的文件夹。每个zip文件中仅包含一个文本文件。我想在所有zip文件的所有文本文件中搜索特定的字符串。

我尝试了此操作(它在zip文件中搜索包含字符串“ ORA-”的任何文本文件),但是它没有用。

zipgrep ORA-1680 *.zip

在不解压缩zip文件的情况下正确执行什么操作?


另请参阅如何通过压缩档案递归grep?(不是精确的重复项,因为那里的要求更加复杂)。
吉尔(Gilles)“所以,别再邪恶了”

Answers:


26

通常,如果不以一种或另一种方式解压缩文件,就不可能在压缩文件中搜索内容。由于zipgrep只是一个shell脚本,包装了unzip和egrep本身,因此您也可以手动进行:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

如果只需要匹配的zip文件列表,则可以使用类似以下内容的文件:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

这样,您只需要解压缩到标准输出(即到内存),而不是将文件解压缩到磁盘。当然,您可以尝试仅grep -a压缩zip文件,但是根据文件的内容和您的模式,您可能会得到误报和/或误报。


第一个选项会将文件解压缩到哪里?
ziggy

2
unzip -c将文件解压缩到stdout。它不会在其他任何地方写入整个未压缩的文件。
诺亚

+1 tks可以挽救我的生命。我只是添加echo“ $ file”; 解压缩-c“ $ file” | grep -q“ ORA-1680”; 知道文件名和结果。
2014年

2
我的版本unzip使用-p的流管道!
吉通科阿

这适用于所有单行命令返回“标准输出”而不是文件名+1的情况
-alimack

16

zipgrep需要一个文件。为了使它跨多个文件工作,请将其循环:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
如果存在匹配项,则在一行中还会打印zip文件名:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

动静脉瘘文件系统呈现,每一个存档文件中的文件系统的观点/path/to/foo.zip是作为目录进行访问~/.avfs/path/to/foo.zip#。这是一个FUSE文件系统,您可以在Solaris上安装它。AVFS提供对大多数常用归档文件格式的只读访问。

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.