Answers:
最简单的方法是列出存档的内容并查找相关扩展名的文件。例如,使用一个zip
文件:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
该-sf
选项指示zip
列出存档中包含的文件。然后,grep
将在行()的末尾查找a .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
成功时,才会打印档案的名称。
-name
为即可-iname
。但是,没有什么意义,许多压缩程序(例如gzip)都需要特定的扩展名。GZ
将无法正常工作。
不如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
*.*
这只会匹配带有扩展名的文件。此外,这将列出所有文件中的所有档案,你没有测试任何文件类型。
foo
但不包含的文件foo.png
。