在所有压缩文件中查找和搜索

在所有压缩文件中查找和搜索

我想扫描硬盘上的所有压缩文件集合,例如 zip、gzip、bzip 等,并搜索其中的特定文件类型(例如图像)。防病毒软件可以做到这一点,所以我相信应该有办法。

答案1

最简单的方法是列出档案的内容并查找相关扩展名的文件。例如,对于一个zip文件:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

选项-sf告诉zip列出存档中包含的文件。然后,grep将查找位于行尾的.png或( )。启用扩展正则表达式,因此我们可以使用OR,并使匹配不区分大小写。.jpg$-E|-i

但是,每个存档工具都有不同的命令来列出内容。我写了一个剧本它可以处理大多数比较流行的问题。如果你将该脚本另存为list_compressed.sh,则可以运行:

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

file这将向您显示最常见的图像类型。请注意,此方法假定文件类型可以通过文件的扩展名来确定。它不会找到没有扩展名的图像文件,也不会识别扩展名错误的文件。如果不从存档中实际提取文件并在每个文件上 运行,则无法解决这个问题。


如果你想找到全部包含硬盘上图像文件的档案,将上述内容与以下内容结合起来find

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

find 命令将搜索所有.gz.tgz.zip文件(您可以根据需要添加任意数量的扩展名),然后将它们传递给我的脚本。-q抑制 grep 的正常输出,不会打印任何内容。&& echo仅当 成功时, 才会打印档案的名称grep

答案2

虽然不如 terdon 先进,但是这样就可以了:

将以下代码保存在所有代码所在的文件夹中,以finda.sh或任何其他您喜欢的名称命名:

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

然后在所有档案所在的目录中运行它,这是输出:

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png

相关内容