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


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

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


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

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

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.