我有几个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
答案 0 :(得分:2)
您可以使用FX expression计算斜边:
identify -format '%[fx:hypot(w,h)] : %f\n' *.jpg
其中w
和h
相应地代表 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+06
(2457600
)。您可以使用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”命令将仅打印每行的第二个项目,即文件名。