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.