¿Existe un comando de Linux para optimizar de forma masiva varios archivos de imagen en un solo paso?

¿Existe un comando de Linux para optimizar de forma masiva varios archivos de imagen en un solo paso?

Tengo un montón de imágenes en una carpeta:

images/image1.jpg
images/image2.jpg
...

Estas imágenes no están optimizadas para la web.

Me pregunto si existe un comando de Linux para optimizar de forma masiva esas imágenes en un solo paso.

ACTUALIZAR: Necesito hacer dos cosas para cada imagen:

  1. si el ancho de la imagen es superior a 900 px, reduzca el ancho a 900 px (manteniendo las proporciones)

  2. guarde el archivo con una calidad inferior, digamos el 70% del original.

Respuesta1

InstalarImagenMagia:

sudo apt-get install imagemagick

Y use el convertcomando de la siguiente manera:

mkdir new
for file in images/*jpg
do convert -quality 70% -resize '>900x' "$file" new/$(basename "$file")
done

Respuesta2

Si tiene una gran cantidad de archivos y desea hacerlo rápidamente, también puede usar el programa paralelo:

sudo apt install imagemagick parallel

Y luego lo siguiente:

find . \( -name '*.jp*g' -o -name '*.png' \) -a ! -name '*.min.*' -type f -print0 | \
parallel -0 'convert {} -resize '>900x' -quality '70%' \
    -set filename:newname "%d/%[basename].min.%[extension]" "%[filename:newname]"'

Repasemos eso:

  • find-- buscar archivos
    • .-- en el directorio actual
    • \( -name '*.jp*g' -o -name '*.png' \)-- que sean png o jpeg (¡tanto "jpg" como "jpeg" son extensiones comunes!)
    • -a ! -name '*.min.*'-- y omitir archivos que ya están minimizados
    • -type f-- y son archivos reales, no enlaces simbólicos ni directorios con nombres extraños
    • -print0-- imprime estos archivos separados con el byte nulo (para que los espacios no rompan las cosas)
  • parallel-- lee el comando anterior y ejecuta este comando en paralelo para cada elemento
    • -0-- cada elemento está separado con el byte nulo
    • convert {}-- llame al programa "convertir" imagemagick con el nombre del archivo sustituido por{}
      • resize '>900x' -quality '70%'- cambie el tamaño de la imagen a un máximo de 900 px en el eje x y cambie la calidad jpeg al 70%.HaymuchosOtras opciones posibles aquí.
      • -set filename:newname "%d/%[basename].min.%[extension]"-- crea una variable con el nuevo nombre de archivo.Consulte los documentos para conocer todos los valores válidos..
        • %d-- el directorio en el que se encuentra el archivo
        • %[basename]-- el nombre del archivo sin extensiones
        • %[extension]-- la extensión original del archivo
      • "%[filename:newname]"-- el nombre del archivo de salida que configuramos en el paso anterior

información relacionada