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


16

我正在尝试查找子文件夹中宽度或高度低于300px的子文件夹中的所有JPG图像。

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

当然,我可以使用找到所有图像find

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

但是管道之后会发生什么呢?我可以使用哪个包来检测图片的属性?

Answers:


17

您可以使用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,则它将仅打印第三列。


3
可以将awk部分缩短:| awk '$1<300||$2<300'| awk '$1<300||$2<300{print $3}'(仅当需要第三列时)。
har-wradim 2014年

@ har-wradim谢谢,很好的建议!
Gerhard Burger 2014年

7
我必须添加一个换行符('%w %h %i\n')以使其对我有用。
qwr

很抱歉写了一个6年的问题,但这是我在Google上找到的唯一部分回答我的问题的结果,基本上我想要的是查找具有特定尺寸或在特定尺寸内的图像,然后将其复制到另一个目录。我知道cp用于复制,但无法将此命令与cp集成在一起。
GhostOrder

@GhostOrder遵循@ har-wradim的建议,仅打印第三列,然后添加另一个类似这样的管道| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

我认为接受的答案非常好,但是我想添加另一个可能的解决方案...

尽管我本人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

1

这为我工作:

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

这是输出示例:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

软件包中的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先检查就无法运行,则无法找到您想要保留的东西-否则删除之前不会提示您)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.