Como girar todas as imagens em um diretório com o imagemagick?

18

Quero girar todas as imagens em um diretório que corresponda a um padrão.

Até agora eu tenho:

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

mas isso não dá saída?

Michael Durrant
fonte

Respostas:

20

Existem alguns problemas com seu código. Primeiro de tudo, você está analisando ls, o que é uma Má Idéia . Você também precisa se referir à variável conforme $fileindicado e também deve citá-la para que não se quebre em espaços. Você está declarando, nummas nunca é usado. Uma maneira mais segura seria:

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

Isso ainda terá problemas se seus arquivos contiverem novas linhas, mas pelo menos não serão interrompidos se o seu caminho contiver espaços.

Se os arquivos estiverem todos no mesmo diretório, poderá ser ainda mais simplificado usando o globbing. Você também pode usar a expansão de parâmetros para criar, em foo_rotated.JPG1vez de foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
terdon
fonte
2
Seu método irá criar original_filename.JPG_rotated.JPG". adicionar "${file%.JPG}"_rotated.JPG será imho mais apropriado. Felicidades!
Valentin Bajrami
11
@ val0x00ff absolutamente (e eu votei na sua resposta, o que sugere isso). Acabei de repetir exatamente o que o OP estava fazendo corrigindo os erros mais evidentes.
terdon
legal! Acabei de modificar um pouco o seu comando.
Valentin Bajrami
11

mogrify -rotate 90 *.jpg O One-Liner melhor para girar todas as imagens com o imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG irá infactar girar tudo .JPGcomeçando com DSCnop diretório

Mogrify (parte do imagemagick) difere de Convertque modifica o arquivo original http://www.imagemagick.org/script/mogrify.php

Alex
fonte
11

Um método simples usando PE (expansão de parâmetros) é

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Valentin Bajrami
fonte
11
Deve-se notar que não há nada bashespecífico, é a sintaxe POSIX sh perfeitamente padrão.
Stéphane Chazelas
6

Não analisels e o lsnão é necessário aqui. Além disso, você deve citar suas variáveis ​​caso elas contenham espaços.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
fonte
espaço ... ou abas, ou nova linha ou asterisco ou de interrogação ou colchete ...
Stéphane Chazelas
6

Não é uma solução imagemagic, mas

sips -r 90 *.JPG

girará todas as imagens que terminem em .JPG 90 graus. É um bom forro.

desk_object
fonte
11
fwiw, isso substitui as imagens originais.
don_crissti
0

Eu precisava me referir ao arquivo como $file, ie

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

Você pode copiar / colar esse código no ubuntu e salvá-lo como "rotate.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Depois de salvar este arquivo, execute-o no terminal usando ./rotate.sh folder_containing_images

vin
fonte