Utilizo el siguiente script para convertir todas jpg
las png
imágenes:
# absolute path to image folder
FOLDER="/home/*/public_html/"
# max width
WIDTH=1280
# max height
HEIGHT=720
#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
pero hoy me sorprendí cuando corrí
ls -l
y encontré todas las fotos modificadas, datos cambiados, grandes o no
Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg
Así que estoy pensando en usar una if
condición para verificar primero la ruta de la imagen y luego, si WIDTH es mayor que 1280 px, ejecutar convert
. De lo contrario no hagas nada.
actualización 2
Construí este script
#!/bin/bash
for i in /root/d/*.jpg; do
read -r w h <<< $(identify -format "%w %h" "$i")
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
fi
done
Así veo find
mejor for
.
for
No busqué en todas las carpetas y subcarpetas.
actualización 3
WIDTH=1280
HEIGHT=720
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read img; do \
anytopnm "$img" | pamfile | \
perl -ane 'exit 1 if $F[3]>1280' || convert "$img" -verbose -resize "${WIDTH}x${HEIGHT}>" "$img"; \
done
está funcionando bien, pero lo entiendo
jpegtopnm: WRITING PPM FILE
cuando no hay imágenes> 1280
Respuesta1
El principal problema con su convert
comando es que el argumento $WIDTHx$HEIGHT\>
intenta expandir una variable llamada $WIDTHx
. Como esta variable no existe, el argumento usado con -resize
será simplemente lo que $HEIGHT\>
sea (que es lo mismo que usar "${HEIGHT}x$HEIGHT>"
). Esto se soluciona usando -resize "${WIDTH}x$HEIGHT>"
. Este es un problema en ambos find
comandos.
Para reducir sus imágenes demasiado grandes, posiblemente podría usar algo como
#!/bin/sh
w=1280
h=720
find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
-exec convert -resize "${w}x${h}>" {} \;
Personalmente, simplemente restauraría las imágenes desde la última copia de seguridad, ya que escalar las imágenes hacia arriba y hacia abajo de esta manera seguramente reducirá su calidad drásticamente.
Cuando pruebes las cosas, ejecuta conjuntos más pequeños de copias de tus imágenes antes de dejar que tus scripts se suelten en toda tu colección de imágenes. También asegúrese de que sus copias de seguridad se estén ejecutando como se esperaba.
Respuesta2
Lamento mucho no haber sido claro, encontré y construí mi script final y espero corregir el título de Q con uno inteligente.
script busca archivos jpg
o png
y, si los encuentra, marque el ancho si se encuentra mayor que 1280, convertirá
#!/bin/bash
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w ]; then
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done