Jak obrócić wszystkie obrazy w katalogu za pomocą imagemagick?

18

Chcę obrócić wszystkie obrazy w katalogu pasującym do wzorca.

Do tej pory mam:

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

ale to nie daje wyników?

Michael Durrant
źródło

Odpowiedzi:

20

Z twoim kodem jest sporo problemów. Przede wszystkim analizujesz ls, co jest złym pomysłem . Musisz także odwoływać się do zmiennej, tak $filejak to wskazałeś, i powinieneś ją również zacytować, aby nie pękała na spacjach. Deklarujesz, numale nigdy nie jest używany. Bezpieczniejszym sposobem byłoby:

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

Będzie to nadal powodować problemy, jeśli Twoje pliki zawierają znaki nowej linii, ale przynajmniej nie ulegną awarii, jeśli ścieżka zawiera spacje.

Jeśli wszystkie pliki znajdują się w tym samym katalogu, można je uprościć za pomocą globowania. Możesz także użyć rozszerzenia parametrów, aby utworzyć foo_rotated.JPG1zamiast foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
terdon
źródło
2
Twoja metoda stworzy original_filename.JPG_rotated.JPG". dodanie "${file%.JPG}"_rotated.JPG będzie bardziej odpowiednie imho. Twoje zdrowie!
Valentin Bajrami
1
@ val0x00ff absolutnie (i głosowałem za odpowiedzią, która to sugeruje). Właśnie powtórzyłem dokładnie to, co OP robi, naprawiając bardziej rażące błędy.
terdon
chłodny! Właśnie zmodyfikowałem trochę twoje polecenie.
Valentin Bajrami
11

mogrify -rotate 90 *.jpg Lepszy One-Liner do obracania wszystkich zdjęć za pomocą imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG wpłynie na obrót wszystkich, .JPGzaczynając od DSCw pkatalogu

Mogrify (część imagemagick ) różni się Converttym, że modyfikuje oryginalny plik http://www.imagemagick.org/script/mogrify.php

Alex
źródło
11

Prostą metodą wykorzystującą PE (rozszerzenie parametrów) jest

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Valentin Bajrami
źródło
1
Należy zauważyć, że nie ma w tym nic bashkonkretnego, jest to całkowicie standardowa składnia sh POSIX.
Stéphane Chazelas
6

Nie analizuj,ls a lstutaj nie jest to wymagane. Ponadto powinieneś zacytować swoje zmienne, jeśli zawierają spacje.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
źródło
spacja ... lub tabulatory, nowa linia, gwiazdka, znak zapytania lub nawias kwadratowy ...
Stéphane Chazelas
6

Nie wyobrażalne rozwiązanie, ale

sips -r 90 *.JPG

obróci wszystkie obrazy o rozszerzeniu .JPG o 90 stopni. To dobry jeden liniowiec.

desk_object
źródło
1
fwiw, to zastępuje oryginalne obrazy.
don_crissti
0

Musiałem odnosić się do pliku jako $file, tj

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 $file+'_rotated'.JPG
done
Michael Durrant
źródło
0

Możesz skopiować / wkleić ten kod w Ubuntu i zapisać go jako „rotate.sh”

#!/bin/bash -e

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

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

cd CUR_DIR

Po zapisaniu tego pliku uruchom go z terminala za pomocą ./rotate.sh folder_containing_images

vin
źródło