Làm thế nào để xoay tất cả các hình ảnh trong một thư mục với hình ảnh tưởng tượng?


18

Tôi muốn xoay tất cả các hình ảnh trong một thư mục phù hợp với một mẫu.

Cho đến nay tôi có:

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

Nhưng điều đó không cho đầu ra?

Câu trả lời:


20

Có khá nhiều vấn đề với mã của bạn. Trước hết, bạn đang phân tích ls đó là một ý tưởng tồi . Bạn cũng cần tham khảo biến như $filebạn đã chỉ ra và bạn cũng nên trích dẫn nó để nó không bị vỡ trên các khoảng trắng. Bạn đang khai báo numnhưng nó không bao giờ được sử dụng. Một cách an toàn hơn sẽ là:

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

Điều này sẽ vẫn có vấn đề nếu các tệp của bạn chứa dòng mới nhưng ít nhất sẽ không bị hỏng nếu đường dẫn của bạn chứa khoảng trắng.

Nếu tất cả các tệp trong cùng một thư mục, nó có thể được đơn giản hóa hơn nữa bằng cách sử dụng Globing. Bạn cũng có thể sử dụng mở rộng tham số để tạo foo_rotated.JPG1thay vì foo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done

2
Phương pháp của bạn sẽ tạo ra original_filename.JPG_rotated.JPG". thêm "${file%.JPG}"_rotated.JPG sẽ là imho thích hợp hơn. Chúc mừng!
Valentin Bajrami

1
@ val0x00ff hoàn toàn (và tôi nêu lên câu trả lời của bạn cho thấy điều đó). Tôi vừa lặp lại điều chính xác mà OP đang thực hiện để sửa các lỗi chói hơn.
terdon

mát mẻ! Tôi chỉ sửa đổi lệnh của bạn một chút.
Valentin Bajrami

11

mogrify -rotate 90 *.jpg Tốt hơn One-Liner về luân tất cả hình ảnh với ImageMagick

mogrify -rotate 90 /tmp/p/DSC*.JPG sẽ hoàn toàn xoay tất cả .JPGbắt đầu với DSCtrong pthư mục

Mogrify (một phần của fantemagick ) khác Convertở chỗ nó sửa đổi tệp gốc http://www.imagemagick.org/script/mogrify.php


11

Một phương pháp đơn giản sử dụng PE (Mở rộng tham số) là

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done

1
Cần lưu ý rằng không có gì bashcụ thể trong đó, đó là cú pháp POSIX tiêu chuẩn hoàn hảo.
Stéphane Chazelas

6

Không phân tích cú pháplslskhông bắt buộc ở đây. Hơn nữa, bạn nên trích dẫn các biến của mình trong trường hợp chúng chứa khoảng trắng.

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done

dấu cách ... hoặc các tab, hoặc dòng mới hoặc dấu hoa thị hoặc dấu hỏi hoặc dấu ngoặc vuông ...
Stéphane Chazelas

6

Không phải là một giải pháp tưởng tượng, nhưng

sips -r 90 *.JPG

sẽ xoay tất cả các hình ảnh kết thúc bằng .JPG 90 độ. Đó là một lót tốt.


1
fwiw, điều này ghi đè lên hình ảnh gốc.
don_crissti

0

Tôi cần phải tham khảo các tập tin như $file, tức là

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

0

Bạn có thể sao chép / dán mã này trong ubfox và lưu nó dưới dạng "rotation.sh"

#!/bin/bash -e

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

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

cd CUR_DIR

Sau khi lưu tệp này, hãy chạy nó từ thiết bị đầu cuối bằng cách sử dụng ./rotate.sh folder_containing_images

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.