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

16

Eu quero rotacionar 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?

    
por Michael Durrant 29.09.2013 / 18:56

7 respostas

17

Existem alguns problemas com o seu código. Primeiro de tudo, você está analisando ls, que é uma Má Idéia . Você também precisa se referir à variável como $file como você aponta e você também deve citá-la para não quebrar em espaços. Você está declarando num , mas 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 caminho contiver espaços.

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

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
    
por 29.09.2013 / 19:16
10

Um método simples usando PE PE (Parâmetro de Expansão) é

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
    
por 29.09.2013 / 19:33
10

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

mogrify -rotate 90 /tmp/p/DSC*.JPG irá de fato rodar todo .JPG começando com DSC no diretório p

Mogrify (parte do imagemagick) difere de Convert em que modifica o arquivo original link

    
por 22.11.2016 / 02:37
6

Não analise ls e o ls nã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
    
por 29.09.2013 / 19:12
6

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

sips -r 90 *.JPG

irá girar todas as imagens terminando em .JPG 90 graus. É um bom forro.

    
por 08.09.2015 / 18:10
0

Eu precisava me referir ao arquivo como $file , ou seja,

for file in 'ls /tmp/p/DSC*.JPG'; do
  convert $file -rotate 90 $file+'_rotated'.JPG
done
    
por 29.09.2013 / 19:11
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

    
por 31.03.2017 / 21:04