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

18

Quiero rotar todas las imágenes en un directorio que coincida con un patrón.

Hasta ahora tengo:

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

pero eso no da salida?

Michael Durrant
fuente

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
terdon
fuente
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

Alex
fuente
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
Valentin Bajrami
fuente
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
Marco
fuente
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.

escritorio_objeto
fuente
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
Michael Durrant
fuente
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

vin
fuente