按尺寸排序图像

时间:2016-10-27 09:59:21

标签: bash

我有几个ID-sequence.jpg名称的图片,其中ID对于一组图片是相同的,例如:

4fd-00027-1.jpg
4fd-00027-2.jpg
4fd-00027-3.jpg
6gq-00017-1.jpg
6gq-00017-2.jpg
6gq-00752-3.jpg
6gq-00752-4.jpg

..我需要移动前3个最大(按尺寸)的图像,但我不太清楚如何:

for file in 'ls -v *.jpg';
do
  IFS=: read -r width height < <(identify -ping -format '%w:%h' "$file")
  # how to compare each for dimensons?
  dir="/Users/eazzy/images_organized/${file%-*}"
  [ -d "$dir" ] || mkdir "$dir"
  echo moving "$file" to "${file%-*}"
  mv "/Users/eazzy/images_trimmed/$file" "$dir"
done

3 个答案:

答案 0 :(得分:2)

按斜边排序

您可以使用FX expression计算斜边:

identify -format '%[fx:hypot(w,h)] : %f\n' *.jpg

其中wh相应地代表 width height ; %f代表 filename (请参阅format and print image properties)。

示例输出

1280 : gentoo_matrix.jpg
738.756 : LA-Woman-048.jpg
2812.64 : passport-photo.jpg
1835.76 : spring_makeup-wallpaper-1600x900.jpg
1196.22 : woman_painting_study_by_warnerator-d4z4s6u.jpg

接下来的步骤是微不足道的。只需按反向人工数字顺序排序并在循环中处理文件:

identify -format '%[fx:hypot(w,h)] : %f\n' *.jpg | \
  sort -h -r | head -3 | \
  while read line; do
    file="${line#*: *}"
    echo "$file"
  done

示例输出

passport-photo.jpg
zh220.jpg
spring_makeup-wallpaper-1600x900.jpg

(斜边的前三个文件)。

请注意,大量数字需要特殊处理,因为它们以科学记数法打印(见下文)。

按区域排序

或者,您可以计算面积。 FX表达式的问题在于大数字以科学记数法打印,例如2.4576e+062457600)。您可以使用awk的{​​{1}}处理此问题,例如:

printf

注意,由于数字是正常的十进制表示法(非科学),我们这里不需要人工数字排序。使用identify -format '%[fx:w*h] : %f\n' *.jpg | \ awk -F: '{ printf("%d :%s\n", $1, $2); }' | \ sort -n -r | head -3 | \ while read line; do file="${line#*: *}" echo "$file" done 调用直接数字排序是安全的。

大量文件的案例

sort -n表达式被shell扩展为参数列表。因此,如果图像数量非常大,您应该逐个迭代它们,例如:

*.jpg

在“群组”中排序

在撰写本文时,很难确定您实际上是指一个 中获取前3个图片,其中“group”您的条件是find . -type f -regex '.*jpg$' -maxdepth 1 \ -exec identify -format '%[fx:w*h] : %f\n' {} \; | \ awk -F: '{ printf("%d :%s\n", $1, $2); }' | \ sort -n -r | head -3 | \ while read line; do file="${line#*: *}" echo "$file" done 之类的前缀。所以真正的目标是按组进行排序,然后按照组中的图像维度进行排序。

解决方案可以源自我上面所写的内容。我们只需将上述内容应用于群组:

${filename%-*}

答案 1 :(得分:0)

以下内容将为您提供每个组中前3个图像的列表,由文件名的前3个字母标识,按其总面积(以像素为单位)排序(即宽度*高度) :

find . -maxdepth 1 -name '*.jpg' -exec identify -format "%f %[w] %[h]\n" '{}' ';' |\
 awk '// { print substr($1,0,4)" "$1" "$2*$3; }' |\
 sort -k1 -rnk3 | \
 awk '// { if(cgrp != $1) { cgrp=$1; cnt=0 } if(cnt++ < 3) { print  $1" "$2 } }'

此代码表示您已安装ImageMagick工具(在大多数* Nix系统上应该不是问题)

(注意,如果已知您的图像文件名包含空格,则可能需要修改它,以使用TAB作为分隔符)

答案 2 :(得分:0)

以下是按宽度排序的简单答案:

identify -ping -format '%w %f\n' *.jpg |\
sort -rn |\
head -3 |\
awk '{print $2 }'

“identify”命令将输出宽度,后跟文件名。

“sort”命令将按数字排序列表,最大数字为

“head”命令将保留前三个条目

“awk”命令将仅打印每行的第二个项目,即文件名。