Làm cách nào để tìm tất cả các hình ảnh có kích thước pixel nhất định bằng cách sử dụng dòng lệnh?


16

Tôi đang cố gắng tìm tất cả các hình ảnh JPG trong một thư mục có các thư mục con có chiều rộng hoặc chiều cao dưới 300px.

Bằng cách này, tôi muốn phát hiện các hình thu nhỏ cũ và xóa chúng.

Để chắc chắn tôi có thể tìm thấy tất cả các hình ảnh bằng cách sử dụng find:

find . -iname "*.jpg" -type f | ...

Nhưng những gì sau ống? Tôi có thể sử dụng gói nào để phát hiện các thuộc tính của ảnh?

Câu trả lời:


17

Bạn có thể sử dụng identifytừ imagemagickvà bạn có thể sử dụng lệnh sau:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

việc sử dụng -exec <command> '{}' \;đảm bảo rằng tên tệp của bạn có thể có khoảng trắng trong đó, ngoài ra bạn có thể sử dụng

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

nơi -I{}chăm sóc điều tương tự.

Điều tôi thích identifylà bạn có thể chỉ định định dạng đầu ra; trong trường hợp '%w %h %i'này cung cấp chiều rộng, chiều cao và tên đường dẫn đầy đủ của hình ảnh. Sau đó, awkbiểu thức chỉ giữ những dòng mà hình ảnh nhỏ hơn kích thước mong muốn.

Ví dụ về đầu ra:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

Chỉnh sửa: Nếu bạn chỉ muốn tên tệp ( rmví dụ như đường ống ), chỉ cần thay đổi $linetrong awkcâu lệnh thành $3, thì nó sẽ chỉ in cột thứ ba.


3
Phần awk có thể được thực hiện ngắn hơn: | awk '$1<300||$2<300'hoặc | awk '$1<300||$2<300{print $3}'(khi chỉ cần cột thứ 3).
har-wradim

@ har-wradim Cảm ơn, đề nghị tốt đẹp!
Burger Gerhard

7
Tôi đã phải thêm một dòng mới ( '%w %h %i\n') để làm cho nó hoạt động cho tôi.
qwr

1

Tôi nghĩ rằng câu trả lời được chấp nhận là rất tốt, nhưng tôi muốn thêm một giải pháp khả thi khác ...

Mặc dù ImageMagickbản thân tôi sử dụng các công cụ thường xuyên nhất bây giờ, netpbmlà một người bạn cũ để xử lý hình ảnh. Bạn có thể thấy kích thước của bất kỳ định dạng hình ảnh nào bằng lệnh:

anytopnm file | pamfile

Điều này sẽ tạo ra đầu ra trông như:

stdin:  PPM raw, 1650 by 1275  maxval 255

Để trả lời câu hỏi "cái gì sau ống?", Tôi sử dụng while readthường xuyên hơn tôi sử dụng xargsvì nó linh hoạt hơn. Câu netpbmtrả lời của tôi cho câu hỏi trông như thế này:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done

1

Điều này làm việc cho tôi:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

Đây là mẫu đầu ra:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

Các identifylệnh từ imagemagickgói làm những gì bạn muốn:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

Một lần nữa, bạn sẽ cần phải sử dụng grepđể sắp xếp kích thước hình ảnh.

Tuy nhiên, tôi nghi ngờ rằng trừ khi bạn có phạm vi kích thước hình ảnh rất rộng, việc sử dụng findđể xóa các tệp JPEG dưới một kích thước nhất định sẽ dễ dàng hơn :

find -iname '*.jpg' -size -10k -delete

(Đáng để chạy mà không cần -deletekiểm tra trước, nó không tìm thấy những thứ bạn muốn giữ - nó sẽ không nhắc bạn trước khi xóa nếu không).

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.