如何使用命令行查找具有特定像素大小的所有图像?
我试图找到文件夹中的所有JPG图像,子文件夹的宽度或高度低于300px。
这样我想检测旧的缩略图并删除它们。
当然,我可以使用find
找到所有图像:
find . -iname "*.jpg" -type f | ...
但管道之后呢? 我可以使用哪个包来检测图片的属性?
您可以使用imagemagick
identify
,并可以使用以下命令:
find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'
使用-exec
确保您的文件名中可以包含空格,或者您也可以使用
find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'
-I{}
处理同样的事情。
我喜欢identify
是你可以指定输出格式; 在这种情况下'%w %h %i'
给出了图像的宽度,高度和完整路径名。 然后awk
表达式仅保留图像小于所需大小的那些行。
输出示例:
64 64 ./thumbsup.jpg 100 150 ./photomin.jpg
编辑:如果你只想要文件名(例如管道到rm
),只需将awk
语句中的$line
更改$line
$3
,然后它只会打印第三列。
我认为接受的答案非常好,但我想添加另一种可能的解决方案……
虽然我现在最常使用ImageMagick
工具,但netpbm
是处理图像的老朋友。 您可以使用以下命令查看任何格式的图像的大小:
anytopnm file | pamfile
这将生成如下所示的输出:
stdin: PPM raw, 1650 by 1275 maxval 255
为了回答“管道后面的内容?”的问题,我使用的while read
比使用xargs
更频繁,因为它更灵活。 我的netpbm
问题答案如下:
find -iname \*.jpg | while read img; do \ anytopnm "$img" | pamfile | \ perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \ done
imagemagick
包中的identify
命令imagemagick
您的需求:
$ identify abc.jpg abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000
同样,您需要使用grep
来整理图像大小。
但是,我怀疑除非你有非常广泛的图像大小,否则使用find
删除给定大小以下的JPEG文件会更容易:
find -iname '*.jpg' -size -10k -delete
(值得一直运行没有-delete
检查它没有找到你想要保留的东西 – 否则在删除之前不会提示你)。