Bagaimana cara merotasi semua gambar dalam direktori dengan imagemagick?


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

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


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

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

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.


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.