Tìm hình ảnh theo kích thước: find / file / awk


9

Tôi đã cố gắng tìm các tệp hình ảnh png ở độ cao nhất định (trên 500px). Tôi biết rằng filesẽ trả lại kích thước hình ảnh. Thí dụ:

$ file TestImg1a.png

TestImg1a.png: PNG image data, 764 x 200, 4-bit colormap, non-interlaced   

Nhưng tôi cần sử dụng điều này để tìm tất cả các tệp trong một thư mục có chiều cao trên 500px. Tôi biết cách in ra tất cả các tệp bất kể chiều cao:

find . -name '*.png' | xargs file | awk '{print $7 " " $1}'

Nhưng làm cách nào để giới hạn $ 7 cho những kết quả lớn hơn 500?

Câu trả lời:


7

Tôi biết điều này là hơi quá mức, nhưng điều này sẽ hoạt động mọi lúc (ngay cả khi có khoảng trắng trong tên tệp của bạn) và bất kể tập tin hiển thị thông tin như thế nào.

find . -name '*.png' -exec file {} \; | sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/\2 \1/' | awk 'int($1) > 500 {print}'

và nó in các kích thước của hình ảnh và tập tin

giải thích:

  1. findtất cả các tệp có tên * .png dưới. và cho mỗi người làm một tập tin về nó

  2. sử dụng sedđể chỉ in tên tệp và kích thước sau đó đặt hàng lại để in kích thước trước

  3. sử dụng awkđể kiểm tra số đầu tiên (chiều cao của pic) để đảm bảo số lớn hơn 500 và nếu đó là kích thước in và tên tệp, nếu không làm gì.


Cảm ơn. Tôi đã phải thực hiện một thay đổi nhỏ - $ 1 trong đối số awk thành $ 3. Nhưng điều này chắc chắn có nó cho tôi.
steve-er-rino


5

Tôi cảm thấy rằng một cái gì đó ngoài tiện ích shell sẽ phù hợp hơn, ví dụ: Perl:

#!/usr/bin/perl

use File::Find;
use Image::Info qw(image_info dim);

find (\&check_height, './');

sub check_height {

  my $info = image_info( $_ );
  my ($width, $height) = dim( $info );
  print $_ . " has height $height\n" if ( $height > 500 );

}

Ít lừa đảo hơn với việc cố gắng phân tích $ 7; chỉ cần lấy kích thước trực tiếp. Có, bạn sẽ cần mô-đun Image :: Info, nhưng, trên CentOS / RHEL, đây là gói tiêu chuẩn, vì vậy bạn chỉ có thể chạy yum install perl-Image-Info.


1
Mặc dù perl thường là một giải pháp tuyệt vời, nhưng trong trường hợp này thì không, vì tôi không có Image :: Info cũng như tùy chọn cài đặt.
steve-er-rino

1
Giải pháp perl có phần nhanh hơn so với find / file / awk, rất hay và trên apt-get install libimage-info-perl
ubfox tạo ra

5

Bạn cũng có thể sử dụng identifytừ ImageMagick:

find . -name \*.png -print0|xargs -0 identify -format '%h %f\n'|
awk '$1>500'|cut -d' ' -f2-

Hoặc trong OS X:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .

0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'

không hoạt động:96, ./4/45445106_w185.png: 86, ./4/404358x_w185.png: 86, ./4/404341x_w185.png: 80, ./4/475986_w185.png: 621, ./4/481693_w185.png: 667, ./4/42513x_w185.png: 86, ./4/404372x_w185.png:
steve-er-rino

@tink, bỏ 7 đô la cho một int trước khi so sánh, tức là int (7 đô la)> 500 .. trong trường hợp không có đúc awk đang dùng đến một so sánh chuỗi theo nghĩa đen
iruvar

Steve, nơi đó "," đến từ đâu? "Tập tin" của tôi không tạo ra điều đó. Nhưng như Chandra đã nói: bạn rõ ràng có thể buộc $ 7 trở thành một số nguyên bằng cách sử dụng phương pháp được chỉ ra trong nhận xét của mình.
tink

câu lệnh awk của bạn sẽ chỉ hoạt động nếu tên tệp không có khoảng trắng trong đó
h3rrmiller

@tink "," là một phần của tệp trả về trong môi trường của tôi.
steve-er-rino

0

Giải pháp này cũng sẽ làm việc. Phần cuối của mã ( mv "$img" ./lowpixel) sẽ di chuyển các tệp bên dưới chiều rộng và chiều cao được chỉ định vào một thư mục. Trong ví dụ sau, tất cả các hình ảnh jpg thấp hơn 300x300 sẽ được chuyển đến một thư mục có tên lowpixel:

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

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.