¿Cómo rotar todas las imágenes en un directorio con imagemagick?


Respuestas:


20

Hay bastantes problemas con su código. En primer lugar, está analizando ls, que es una mala idea . También debe referirse a la variable como $fileseñala y también debe citarla para que no se rompa en espacios. Estás declarando numpero nunca se usa. Una forma más segura sería:

find /tmp/p/ -name "DSC*.JPG" | while IFS= read -r file; do
  convert "$file" -rotate 90 "$file"_rotated.JPG
done

Esto seguirá teniendo problemas si sus archivos contienen nuevas líneas, pero al menos no se romperán si su ruta contiene espacios.

Si todos los archivos están en el mismo directorio, puede simplificarse aún más con globbing. También puede usar la expansión de parámetros para crear en foo_rotated.JPG1lugar de foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done

2
Tu método creará original_filename.JPG_rotated.JPG". agregar "${file%.JPG}"_rotated.JPG será más apropiado en mi humilde opinión. ¡Salud!
Valentin Bajrami

1
@ val0x00ff absolutamente (y he votado tu respuesta que sugiere eso). Acabo de repetir exactamente lo que estaba haciendo el OP para corregir los errores más evidentes.
terdon

¡frio! Acabo de modificar un poco tu comando.
Valentin Bajrami

11

mogrify -rotate 90 *.jpg El mejor One-Liner para rotar todas las imágenes con imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG de hecho rotará todo .JPGcomenzando DSCen el pdirectorio

Mogrify (parte de imagemagick) difiere Converten que modifica el archivo original http://www.imagemagick.org/script/mogrify.php


11

Un método simple que usa PE (expansión de parámetros) es

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done

1
Cabe señalar que no hay nada bashespecífico allí, es una sintaxis sh POSIX perfectamente estándar.
Stéphane Chazelas

6

No analizarls y lsno se requiere aquí. Además, debe citar sus variables en caso de que contengan espacios.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done

espacio ... o pestañas, o nueva línea o asterisco o signo de interrogación o corchete ...
Stéphane Chazelas

6

No es una solución imagemagic, pero

sips -r 90 *.JPG

rotará todas las imágenes que terminen en .JPG 90 grados. Es un buen trazador de líneas.


1
fwiw, esto sobrescribe las imágenes originales.
don_crissti

0

Necesitaba referirme al archivo como $file, es decir

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 $file+'_rotated'.JPG
done

0

Puede copiar / pegar este código en ubuntu y guardarlo como "rotate.sh"

#!/bin/bash -e

CUR_DIR=`pwd`
cd "${1}"

for file in *.jpg; do
    convert "${file}" -rotate 90 "${file}";
done

cd CUR_DIR

Después de guardar este archivo, ejecútelo desde la terminal usando ./rotate.sh folder_containing_images

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.