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

6ft*_*Dan 9 archive search

我想扫描我的硬盘驱动器中的所有压缩文件集合,如 zip、gzip、bzip 等,并搜索某些文件类型(如图像)的内容。防病毒'做到了,所以我相信应该有办法。

ter*_*don 17

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

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png
Run Code Online (Sandbox Code Playgroud)

-sf选项告诉zip列出存档中包含的文件。然后,grep将寻找一个.png.jpg是在该行的末尾($)。在-E启用扩展正则表达式,所以我们可以使用|如OR和-i使匹配不区分大小写。

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

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
Run Code Online (Sandbox Code Playgroud)

这将向您展示最常见的图像类型。请注意,此方法假定文件类型可由文件的扩展名确定。它不会找到没有扩展名的图像文件,也不会识别具有错误扩展名的文件。如果不实际从存档中提取文件并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
Run Code Online (Sandbox Code Playgroud)

find 命令将搜索所有.gz,.tgz.zip文件(您可以添加任意数量的扩展名),然后将这些文件通过我的脚本传递。在-qgrep的是正常的输出抑留,什么都不会被打印出来。在&& echo将打印只有在存档的名字grep是成功的。