Comment faire pivoter toutes les images d'un répertoire avec imagemagick?

18

Je veux faire pivoter toutes les images d'un répertoire qui correspondent à un motif.

Jusqu'à présent, j'ai:

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

mais cela ne donne aucune sortie?

Michael Durrant
la source

Réponses:

20

Il y a pas mal de problèmes avec votre code. Tout d'abord, vous analysez ls qui est une mauvaise idée . Vous devez également faire référence à la variable comme $filevous le faites remarquer et vous devez également la citer pour qu'elle ne se casse pas sur les espaces. Vous déclarez nummais il n'est jamais utilisé. Un moyen plus sûr serait:

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

Cela aura toujours des problèmes si vos fichiers contiennent des sauts de ligne mais au moins ne se cassera pas si votre chemin contient des espaces.

Si les fichiers sont tous dans le même répertoire, il peut être encore simplifié en utilisant la globalisation. Vous pouvez également utiliser l'expansion des paramètres pour créer foo_rotated.JPG1au lieu de foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
terdon
la source
2
Votre méthode va créer original_filename.JPG_rotated.JPG". l'ajout "${file%.JPG}"_rotated.JPG sera à mon humble avis plus approprié. À votre santé!
Valentin Bajrami
1
@ val0x00ff absolument (et j'ai surévalué votre réponse qui le suggère). Je viens de répéter exactement ce que le PO faisait en corrigeant les erreurs les plus flagrantes.
terdon
cool! Je viens de modifier un peu ta commande.
Valentin Bajrami
11

mogrify -rotate 90 *.jpg Le meilleur One-Liner pour faire pivoter toutes les images avec imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG va en fait tourner tout en .JPGcommençant par DSCdans le prépertoire

Mogrify (qui fait partie d'imagemagick) diffère du Convertfait qu'il modifie le fichier d'origine http://www.imagemagick.org/script/mogrify.php

Alex
la source
11

Une méthode simple utilisant PE (Parameter Expansion) est

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Valentin Bajrami
la source
1
Il convient de noter qu'il n'y a rien de bashspécifique là-dedans, c'est une syntaxe POSIX sh parfaitement standard.
Stéphane Chazelas
6

Ne pas analyserls et le lsn'est pas requis ici. De plus, vous devez citer vos variables au cas où elles contiennent des espaces.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
la source
espace ... ou tabulations, ou nouvelle ligne ou astérisque ou point d'interrogation ou crochet ...
Stéphane Chazelas
6

Pas une solution imaginaire, mais

sips -r 90 *.JPG

fera pivoter toutes les images se terminant par .JPG à 90 degrés. C'est une bonne doublure.

desk_object
la source
1
fwiw, cela écrase les images originales.
don_crissti
0

Je devais me référer au fichier comme $file, c.-à-d.

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

Vous pouvez copier / coller ce code dans ubuntu, et l'enregistrer sous "rotation.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Après avoir enregistré ce fichier, exécutez-le à partir du terminal en utilisant ./rotate.sh folder_containing_images

vin
la source