我想扫描我的硬盘驱动器中的所有压缩文件集合,如 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
文件(您可以添加任意数量的扩展名),然后将这些文件通过我的脚本传递。在-q
grep的是正常的输出抑留,什么都不会被打印出来。在&& echo
将打印只有在存档的名字grep
是成功的。