Ну, самый простой способ сделать это - использовать ImageMagick . Он должен быть в репозиториях вашего дистрибутива Linux, для систем на основе Debian:
sudo apt-get install imagemagick
Одной из программ пакета ImageMagick является identify
печать характеристик списка файлов входных изображений. В сочетании с ним sort
вы получите список изображений, отсортированных по размеру (вы можете изменить png для любого расширения:)
identify *png | sort -gk 3
Если вам действительно нужно соотношение сторон, а не только размер, попробуйте что-то вроде этого:
Простой вариант, предполагает, что имена ваших изображений не имеют пробелов :
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \
sed 's/\[.\]//' | sort -gk 3
Команда gawk разделяет 3-е поле (размер изображения в формате LxH) на массив «размеры», а затем печатает 1-е поле (имя изображения) и результат деления длины изображения на его высоту. Команда sed
просто украшает вывод, и sort
команда сортирует результат в соответствии с размером изображения.
Более сложный, этот может иметь дело с пробелами в именах файлов:
find . \( -iname "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\
perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \
sort -gk 2
Здесь мы используем find
для идентификации интересующих нас файлов и запускаем identify
команду, а затем передаем ее вывод с помощью небольшого сценария PERL. Регулярное выражение ищет три заглавные буквы ( [A-Z]{3}
), которые должны быть форматом изображения. Как только мы нашли это, легко определить имя и размеры изображения.
Я не использую gawk здесь, потому что наличие пробелов в именах входных файлов будет путать номера полей. Наконец, скрипт распечатает имя изображения и результат деления длины / высоты, которое мы sort
численно выполнили.
Если простого просмотра доступных соотношений сторон недостаточно, если у вас есть хотя бы одно изображение с желаемым соотношением сторон, просто используйте grep, чтобы извлечь те изображения, соотношение которых является ближайшим:
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg
identify -format "%[fx:w/h]:%M\n" *.jpg
. Я не знаю, как легко отсортировать по близости к произвольному значению.sort
похоже не поддерживает такую сортировку.