Как повернуть все изображения в каталоге с помощью imagemagick?

18

Я хочу повернуть все изображения в каталоге, которые соответствуют шаблону.

Пока что у меня есть:

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

но что не дает выхода?

Майкл Даррант
источник

Ответы:

20

Есть довольно много проблем с вашим кодом. Прежде всего, вы анализируете ls, что является плохой идеей . Вы также должны ссылаться на переменную так, $fileкак вы указали, и вы также должны заключить ее в кавычки, чтобы она не разбивалась на пробелы. Вы заявляете, numно это никогда не используется. Более безопасный способ был бы:

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

Это по-прежнему будет иметь проблемы, если ваши файлы содержат символы новой строки, но, по крайней мере, не прервется, если ваш путь будет содержать пробелы.

Если все файлы находятся в одном и том же каталоге, его можно еще больше упростить с помощью глобализации. Вы также можете использовать расширение параметра для создания foo_rotated.JPG1вместо foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
Тердон
источник
2
Ваш метод создаст original_filename.JPG_rotated.JPG". добавление "${file%.JPG}"_rotated.JPG будет более подходящим imho. Ура!
Валентин Байрами
1
@ val0x00ff абсолютно (и я одобрил твой ответ, который предполагает это). Я просто повторил то, что делал ОП, исправляя более явные ошибки.
Тердон
круто! Я просто немного изменил твою команду.
Валентин Байрами
11

mogrify -rotate 90 *.jpg Лучший One-Liner для поворота всех изображений с помощью imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG будет фактически вращать все, .JPGначиная с DSCв pкаталоге

Mogrify (часть imagemagick ) отличается от того, Convertчто он изменяет оригинальный файл http://www.imagemagick.org/script/mogrify.php

Alex
источник
11

Простой метод с использованием PE (расширение параметров)

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Валентин Байрами
источник
1
Следует отметить, что здесь нет ничего bashконкретного, это совершенно стандартный синтаксис POSIX sh.
Стефан Шазелас
6

Не разбирайтеls и здесь lsне требуется. Кроме того, вы должны заключать в кавычки ваши переменные в случае, если они содержат пробелы.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
источник
пробел ... или табуляция, или новая строка, или звездочка, или вопросительный знак, или квадратная скобка ...
Стефан Шазелас
6

Не имиджмагическое решение, а

sips -r 90 *.JPG

повернет все изображения, заканчивающиеся на .JPG, на 90 градусов. Это хороший лайнер.

desk_object
источник
1
Кстати, это переписывает исходные изображения.
don_crissti
0

Мне нужно было ссылаться на файл как $file, т.е.

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 $file+'_rotated'.JPG
done
Майкл Даррант
источник
0

Вы можете скопировать / вставить этот код в Ubuntu и сохранить его как «rotate.sh»

#!/bin/bash -e

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

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

cd CUR_DIR

После сохранения этого файла запустите его из терминала, используя ./rotate.sh folder_containing_images

Vin
источник