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


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

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


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

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

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.


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.