如何使用命令行查找具有特定像素大小的所有图像?

我试图找到文件夹中的所有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检查它没有找到你想要保留的东西 – 否则在删除之前不会提示你)。