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

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

我试图找出某个文件夹中所有子文件夹宽度或高度低于 300px 的 JPG 图像。

这样,我想检测旧缩略图并将其删除。

我肯定可以使用以下方法找到所有图像find

find . -iname "*.jpg" -type f | ...

但是管道后面跟着什么呢?我可以使用哪个包来检测图片属性?

答案1

您可以使用identifyfrom imagemagick,并且可以使用以下命令:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

使用-exec <command> '{}' \;确保你的文件名中可以​​有空格,或者你可以使用

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),只需将语句更改$lineawk$3那么它将只打印第三列。

答案2

这对我有用:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

这是输出示例:

./2520161636481000.png 75x75
./2620160819191100.png 75x75
./2420181545550700.png 75x75

答案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

答案4

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先检查它是否找到您想要保留的内容 - 否则它不会在删除之前提示您)。

相关内容