我想扫描硬盘上的所有压缩文件集合,例如 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