2009-02-18 24 views
7

Tôi muốn thay đổi kích thước danh sách hình ảnh, tất cả trong thư mục. Để đạt được điều đó, tôi sử dụng convert từ imagemagick. Tôi muốn thay đổi kích thướcThay đổi kích thước danh sách hình ảnh trong dòng lệnh

image1.jpg 
image2.jpg 
... 

vào

image1-resized.jpg 
image2-resized.jpg 
... 

tôi đã tự hỏi nếu có một phương pháp để đạt được điều này trong một dòng lệnh duy nhất. Một giải pháp thanh lịch có thể thường hữu ích, không chỉ trong trường hợp này.

EDIT:

Tôi muốn một tổ chức phi giải pháp kịch bản giống như, tức là. không có vòng lặp.

Trả lời

6
ls *.jpg|sed -e 's/\..*//'|xargs -I X convert X.jpg whatever-options X-resized.jpg 

Bạn có thể loại bỏ sed và là extension-generic nếu bạn sẵn sàng chấp nhận một tên tập tin cuối cùng hơi khác, 'resized-image1.jpg' thay vì ' image1-resized.jpg ':

ls|xargs -I X convert X whatever-options resized-X 
+0

đây là loại lừa Tôi đã suy nghĩ về, đẹp một;) – claf

+0

Phải! Đó là điều tôi muốn! Nếu không có ống sed sẽ là hoàn hảo, không có vấn đề nếu thay đổi kích thước là trong đầu –

10

Nếu bạn muốn thay đổi kích thước họ 800x600:

for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done 

(công trình trong bash)

+0

+1 Đây chính là điều tương tự tôi sử dụng –

2

Nếu tập tin hình ảnh của bạn có phần mở rộng khác nhau:

 
for f in *; do convert -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; done 
4

GNU Parallel thậm chí còn dễ dàng hơn cho các vòng lặp, và nó thường nhanh hơn:

parallel convert -resize 800x600 -- "{}" "{.}-resized.jpg" ::: *.jpg 

Một vài điều xảy ra ở đây, từ phải sang trái:

  • ::: *.jpg có nghĩa là chạy lệnh cho mọi tệp jpg
  • {.} có nghĩa là chèn tên tệp hiện tại mà không cần hậu tố (.jpg)
  • {} có nghĩa là chèn tên tệp hiện tại
  • parallel có nghĩa là chạy lệnh sau nhiều lần song song. Nó sẽ chọn tối đa để làm song song để phù hợp với số lõi của máy tính của bạn. Khi mỗi người kết thúc nó sẽ khởi động kế tiếp cho đến khi tất cả các tập tin jpg được chuyển đổi.

Điều này chạy lệnh convert --resize 800x600 -- foo.jpg foo-resized.jpg cho mỗi tệp. -- yêu cầu chuyển đổi để ngừng xử lý cờ, trong trường hợp tên tệp xảy ra bắt đầu bằng -.

P.S. Trên mac của tôi, tôi có Homebrew cài đặt, vì vậy tôi đã có thể cài đặt song song và chuyển đổi với

brew install parallel 
brew install imagemagick 
+0

Câu trả lời hay - đây là con đường để đi. Bạn không chắc chắn phần '- -' là gì. –

Các vấn đề liên quan