Bagaimana cara merotasi semua gambar dalam direktori dengan imagemagick?

18

Saya ingin memutar semua gambar dalam direktori yang cocok dengan suatu pola.

Sejauh ini saya punya:

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

tapi itu tidak menghasilkan apa-apa?

Michael Durrant
sumber

Jawaban:

20

Ada beberapa masalah dengan kode Anda. Pertama-tama, Anda parsing ls yang merupakan Ide Buruk . Anda juga perlu merujuk ke variabel seperti yang $fileAnda tunjukkan dan Anda juga harus mengutipnya agar tidak pecah pada spasi. Anda mendeklarasikan numtetapi tidak pernah digunakan. Cara yang lebih aman adalah:

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

Ini masih akan memiliki masalah jika file Anda berisi baris baru tetapi setidaknya tidak akan pecah jika jalur Anda berisi spasi.

Jika semua file berada di direktori yang sama, maka dapat disederhanakan menggunakan globbing. Anda juga dapat menggunakan ekspansi parameter untuk membuat foo_rotated.JPG1alih-alih foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done
terdon
sumber
2
Metode Anda akan dibuat original_filename.JPG_rotated.JPG". menambahkan "${file%.JPG}"_rotated.JPG akan lebih tepat imho. Bersulang!
Valentin Bajrami
1
@ val0x00ff benar-benar (dan saya meningkatkan jawaban Anda yang menyarankan itu). Saya baru saja mengulangi hal yang OP lakukan memperbaiki kesalahan yang lebih mencolok.
terdon
keren! Saya baru saja memodifikasi perintah Anda.
Valentin Bajrami
11

mogrify -rotate 90 *.jpg One-Liner yang lebih baik untuk memutar semua gambar dengan imagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG akan menginput semua .JPGawal dengan DSCdalam pdirektori

Mogrify (bagian dari imagemagick) berbeda Convertdengan yang memodifikasi file asli http://www.imagemagick.org/script/mogrify.php

Alex
sumber
11

Metode sederhana menggunakan PE (Parameter Expansion) adalah

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done
Valentin Bajrami
sumber
1
Perlu dicatat bahwa tidak ada yang bashspesifik di sana, itu sintaks POSIX sh standar sempurna.
Stéphane Chazelas
6

Jangan parsels dan lstidak diperlukan di sini. Selanjutnya, Anda harus mengutip variabel Anda jika mengandung spasi.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done
Marco
sumber
space ... atau tab, atau newline atau asterisk atau tanda tanya atau braket persegi ...
Stéphane Chazelas
6

Bukan solusi imajemagis, tetapi

sips -r 90 *.JPG

akan memutar semua gambar yang berakhiran .JPG 90 derajat. Ini liner yang bagus.

desk_object
sumber
1
fwiw, ini menimpa gambar asli.
don_crissti
0

Saya perlu merujuk file sebagai $file, yaitu

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

Anda dapat menyalin / menempelkan kode ini di ubuntu, dan menyimpannya sebagai "rotate.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Setelah menyimpan file ini, jalankan dari terminal menggunakan ./rotate.sh folder_containing_images

vin
sumber