我试图找出某个文件夹中所有子文件夹宽度或高度低于 300px 的 JPG 图像。
这样,我想检测旧缩略图并将其删除。
我肯定可以使用以下方法找到所有图像find
:
find . -iname "*.jpg" -type f | ...
但是管道后面跟着什么呢?我可以使用哪个包来检测图片属性?
答案1
您可以使用identify
from 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
),只需将语句更改$line
为awk
,$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
先检查它是否找到您想要保留的内容 - 否则它不会在删除之前提示您)。