ImageMagick trên nhiều tệp


9

Tôi đã chuyển đổi một tệp duy nhất từ ​​BMP sang PNG bằng ImageMagick convertbằng lệnh bên dưới

convert CD\ Front.bmp CD\ Front.png

Tôi có nhiều tệp như vậy, vì vậy tôi đã thử:

for f in */*.bmp ; do convert $f ${f%bmp}png; done

nhưng lệnh này bị treo mãi mãi.

Tôi đang làm gì sai?

Câu trả lời:


12

Rất có thể bạn gặp sự cố vì bạn không trích dẫn tên tệp:

for f in */*.bmp ; do convert "$f" "${f%bmp}png" ; done
#                             ^  ^ ^           ^

làm điều này để không gian trong tên tập tin không gây ra vấn đề.


3
$fcũng nên được trích dẫn
Mat

Bạn nói đúng, cảm ơn bạn đã chỉ ra
Zelda

1
Trích dẫn các biến là chính xác, nhưng nếu bạn trích dẫn toàn cầu thì shell sẽ tìm kiếm theo nghĩa đen */*.bmp.
evilsoup

Cảm ơn bạn là tốt. Tôi nên thử các giải pháp của mình trước khi đăng ...
Zelda


1

Tôi sẽ cấu trúc lại mã như thế này. Tôi thấy phương pháp này rõ ràng hơn và dễ gỡ lỗi hơn:

find . -type f -name '*.bmp' |\
  while read BMP
  do
    DIR=$(dirname "$BMP")
    PNG="$(echo $BMP | sed 's/.bmp//g')"
    convert "${BMP}" "${PNG}".png
  done

1
Tôi đã tự do thay đổi JPEG thành PNG trong khi xem xét
Anthon

À, cảm ơn. Nhưng nó cũng hoạt động với JPEG!
JakeGould

1
Vâng, hãy đoán nó, nhưng đó không phải là những gì OP yêu cầu ;-)
Anthon

Đừng sử dụng find | while read, đặc biệt là khi một quả địa cầu sẽ đủ.
Kevin

Và sed sẽ tốt hơn khi 's/\.bmp$/.png/', sau đó rõ ràng loại bỏ .png khỏi lệnh thực tế
Kevin
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.