我有一个文件列表,我需要查找所有图像文件从该列表中。
例如,如果我的列表包含以下内容:
pidgin.tar.gz
photo01.jpg
picture01
screenshot.gif
invoice.pdf
那么我只想选择:
photo01.jpg
picture01
screenshot.gif
笔记:
- 方法不得依赖于文件扩展名
- Photoshop 和 Gimp 的模糊图像格式可以忽略。 (如果
feh
无法显示,则不是图像)
答案1
以下命令列出了list_file
包含图像文件名称的行:
<list_file xargs -d \\n file -i | sed -n 's!: *image/[^ :]*$!!p'
file -i FOO
查看 的前几个字节以FOO
确定其格式并打印一行FOO: image/jpeg
(-i
表示显示 MIME 类型;它特定于 Linux 上的 GNU 文件)。xargs -d \\n
从标准输入读取文件列表(每行一个)并对它应用后续命令。 (这需要 Linux 上的 GNU xargs;在其他系统上,省略-d \\n
,但文件列表不能包含\'"
空格或空格)。- 该
sed
命令过滤掉: image/FOO
后缀,只显示文件名。它忽略与图像文件不对应的行。
答案2
file -ib image | awk '"^image/" {print}'
如果文件检测到图像,它应该打印如下行:
image/jpeg; charset=binary
它适用于幻数,因此它不基于扩展。它
答案3
除了file
命令之外,您还可以使用 ImageMagick。以下将显示当前目录中所有文件的类型:
find -type f -depth 0 -print0 | xargs -0 identify
该identify
命令将为各种文件类型打印出如下内容:
text.txt[8] TXT 612x792 612x792+0+0 16-bit DirectClass 694B 0.320u 0:00.330
php.jpg[31] JPEG 1280x1024 1280x1024+0+0 8-bit DirectClass 195KB 0.000u 0:00.000
动画 GIF 文件将打印更多信息(这是 21 帧 GIF):
adhd.gif[0] GIF 211x200 211x200+0+0 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[1] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[2] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
...
adhd.gif[18] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[19] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[20] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
然后,您可以使用awk
或类似的工具来决定如何处理它们。
答案4
也许我缺少一些东西,但这似乎对我有用:
file -i * | grep "image/" | cut -d: -f1