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

mcb*_*etz 19 command-line metadata find

我试图在一个文件夹中查找所有 JPG 图像,该文件夹的子文件夹的宽度或高度低于 300 像素。

这样我想检测旧缩略图并删除它们。

当然,我可以使用find以下命令找到所有图像:

find . -iname "*.jpg" -type f | ...
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*ger 19

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

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

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

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'
Run Code Online (Sandbox Code Playgroud)

在这里-I{}处理同样的事情。

我喜欢的identify是你可以指定输出格式;在这种情况下'%w %h %i',它给出了图像的宽度、高度和完整路径名。然后awk表达式只保留那些图像小于所需大小的行。

输出示例:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg
Run Code Online (Sandbox Code Playgroud)

编辑:如果您只想要文件名(rm例如管道),只需$lineawk语句更改为$3,那么它只会打印第三列。

  • 我不得不添加一个换行符 (`'%w %h %i\n'`) 让它为我工作。 (9认同)
  • awk 部分可以缩短:`| awk '$1&lt;300||$2&lt;300'` 或 `| awk '$1&lt;300||$2&lt;300{print $3}'`(当只需要第三列时)。 (3认同)