script de shell para get el tamaño de píxel de la image

Estoy tratando de crear una secuencia de commands de shell que devuelva la image más grande en dimensiones totales de tamaño de píxel?

Por ejemplo:

Tengo muchos directorys de más de 7000+, cada directory tiene imágenes:

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 

Entonces el resultado esperado es:

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

Así que pensé que la mejor manera es averiguar el total de las dimensiones después de recolectar las figuras … por lo tanto, trato de crear un script bash con un command sips que pueda recoger las figuras

Aquí ejemplo:

  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 

Pero obtuve un error en el resultado.

¿Alguna idea o mejor manera?

aquí hay una manera de get la altura y el ancho en un solo paso:

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

identify es parte del package ImageMagick.

Tu "$ far" seguramente no es lo que quieres:

 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 

En realidad, identify puede tomar varios files, por lo que una técnica más eficiente:

 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 

El command awk es un poco complicado porque quiero manejar nombres de imágenes que pueden contener espacios

 #!/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 
  • No use ls para iterar sobre files en scripts; los espacios en blanco en nombres de file los frenarán.
  • No hagas cd alnetworkingedor.
  • No necesitamos orderar para encontrar el file más grande por área.
  • Para hacer aritmética en bash, no necesitas expr , pero $ ((a * b)).

Identificar las necesidades ImageMagick .

El command sed no funcionará si su nombre de file se ve demasiado cerca como el resultado de la identificación .