сценарий оболочки для получения размера пикселя изображения

Я пытаюсь создать сценарий оболочки, который возвращает наибольшее изображение в размере размера пикселей размера?

Например:

У меня много каталогов более 7000+, в каждом каталоге есть изображения:

dir_1/ picture_1.png = 800x600 picture_2.png = 80x100 picture_3.png = 80x640 picture_4.png = 500x630 dir_2/ p_1.png = 800x600 p_2.jpeg = 800x1000 p_3.png = 180x1640 p_4.gif = 500x30 

Таким образом, ожидаемый результат:

  the largest one in dir_1 is: picture_1.png the largest one is dir_2 is: p_2.png 

Поэтому я думал, что лучший способ – узнать общее количество измерений после сбора цифр. Поэтому я пытаюсь создать скрипт bash с помощью команды sips, которая может собирать цифры

Вот пример:

  for f in *; do far=$( cd $f/OEBPS/image/ | ls * | egrep 'jpg|png|jpeg') W=$( sips -g pixelWidth $far | cut -f 2 -d":" ) H=$( sips -g pixelHeight $far | cut -f 2 -d":" ) coll=$(expr $W + $H) echo $f total is: $coll cd - done 

Но получил ошибку по результату.

Любая идея или лучший способ?

вот способ получить высоту и ширину за один шаг:

 IFS=x read wh < <(identify "$file" | grep -oP '\d+x\d+(?=\+)') 

identify является частью пакета ImageMagick.

Ваш «$ far», конечно, не то, что вы хотите:

 for dir in */OEBPS/image/; do for image in "$dir"/*.{jpg,png,jpeg}; do IFS=x read wh < <(identify "$image" | grep -oP '\d+x\d+(?=\+)') echo $((w*h)) "$image" done | sort -n | tail -1 | { read size file echo "largest in $dir is $file" } done 

Фактически, identify может принимать несколько файлов, поэтому более эффективный метод:

 for dir in */OEBPS/image/; do identify "$dir"/*.{jpg,png,jpeg} | awk '{split($(NF-6), a, /x/); split($0, b, /[[]/); print a[1]*a[2], b[1]}' | sort -n | tail -1 | { read size file echo "largest in $dir is $file" } done 

Команда awk немного сложна, потому что я хочу обрабатывать имена изображений, которые могут содержать пробелы

 #!/bin/bash file="" max=0 for f in /OEBPS/image/*{png,jpg,jpeg} do id=$(identify "$f") size=$(echo ${id} | sed -r 's/.* (JPEG|PNG) ([0-9]+)x([0-9]+) .*/\2*\3/') area=$(($size)) if (( area >= max )) then max=$area file="$f" fi done echo $max $file 
  • Не используйте ls для итерации файлов в скриптах – пробелы в именах файлов будут их тормозить.
  • Не сходите .
  • Нам не нужна сортировка, чтобы найти самый большой файл по области.
  • Для выполнения арифметики в bash вам не требуется expr , но $ ((a * b)).

Определите потребности ImageMagick .

Команда sed не будет работать, если ваше имя файла будет выглядеть слишком близко, как результат идентификации .