Wie kann ich mit imagemagick alle Bilder in einem Verzeichnis drehen?

18

Ich möchte alle Bilder in einem Verzeichnis drehen, die einem Muster entsprechen.

Bisher habe ich:

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

aber das gibt keine ausgabe?

Michael Durrant
quelle

Antworten:

20

Es gibt einige Probleme mit Ihrem Code. Zunächst analysieren Sie ls, was eine schlechte Idee ist . Sie müssen auch auf die Variable verweisen, $filewie Sie es hervorheben, und Sie sollten sie auch in Anführungszeichen setzen, damit sie bei Leerzeichen nicht unterbrochen wird. Sie erklären, numaber es wird nie verwendet. Ein sicherer Weg wäre:

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

Dies wird immer noch Probleme haben, wenn Ihre Dateien Zeilenumbrüche enthalten, aber zumindest nicht, wenn Ihr Pfad Leerzeichen enthält.

Wenn sich alle Dateien im selben Verzeichnis befinden, kann dies durch Globbing weiter vereinfacht werden. Sie können auch Parameter Erweiterung zum Erstellen foo_rotated.JPG1statt foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
terdon
quelle
2
Ihre Methode wird erstellen original_filename.JPG_rotated.JPG". Hinzufügen "${file%.JPG}"_rotated.JPG wird besser geeignet sein, imho. Prost!
Valentin Bajrami
1
@ val0x00ff absolut (und ich habe deine Antwort, die dies nahelegt, positiv bewertet). Ich habe nur genau das wiederholt, was das OP tat, um die auffälligeren Fehler zu beheben.
Terdon
cool! Ich habe gerade Ihren Befehl ein wenig geändert.
Valentin Bajrami
11

mogrify -rotate 90 *.jpg Der bessere Einzeiler zum Drehen aller Bilder mit imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG dreht sich also alles .JPGbeginnend mit DSCim pVerzeichnis

Mogrify (ein Teil von imagemagick) unterscheidet sich Convertdarin, dass es die Originaldatei http://www.imagemagick.org/script/mogrify.php ändert

Alex
quelle
11

Eine einfache Methode mit PE (Parameter Expansion) ist

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Valentin Bajrami
quelle
1
Es sollte beachtet werden, dass es dort nichts bashSpezifisches gibt, es ist die vollkommen standardmäßige POSIX-sh-Syntax.
Stéphane Chazelas
6

Nicht analysierenls und das lsist hier nicht erforderlich. Darüber hinaus sollten Sie Ihre Variablen in Anführungszeichen setzen, falls sie Leerzeichen enthalten.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
quelle
Leerzeichen ... oder Tabulatoren oder Zeilenvorschub oder Sternchen oder Fragezeichen oder eckige Klammer ...
Stéphane Chazelas
6

Keine imagemagische Lösung, aber

sips -r 90 *.JPG

dreht alle Bilder, die mit .JPG enden, um 90 Grad. Es ist ein guter Einzeiler.

desk_object
quelle
1
fwiw, dies überschreibt die Originalbilder.
don_crissti
0

Ich musste mich auf die Datei beziehen als $file, dh

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

Sie können diesen Code in Ubuntu kopieren / einfügen und als "rotate.sh" speichern.

#!/bin/bash -e

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

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

cd CUR_DIR

Führen Sie diese Datei nach dem Speichern über das Terminal aus ./rotate.sh folder_containing_images

vin
quelle