Temukan gambar berdasarkan ukuran: find / file / awk

9

Saya sudah mencoba menemukan file gambar png dengan ketinggian tertentu (lebih dari 500px). Saya tahu itu fileakan mengembalikan dimensi gambar. Contoh:

$ file TestImg1a.png

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

Tapi saya perlu menggunakan ini untuk menemukan semua file dalam direktori dengan ketinggian lebih dari 500px. Saya tahu cara mencetak semua file terlepas dari tinggi:

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

Tetapi bagaimana saya membatasi $ 7 untuk hasil yang lebih besar dari 500?

steve-er-rino
sumber

Jawaban:

7

saya tahu ini agak berlebihan tetapi, ini akan bekerja setiap saat (bahkan jika ada spasi dalam nama file Anda) dan terlepas dari bagaimana file menampilkan informasi.

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

dan itu mencetak dimensi gambar dan file

penjelasan:

  1. findsemua file bernama * .png di bawah. dan untuk setiap file di dalamnya

  2. gunakan seduntuk mencetak hanya nama file dan dimensi kemudian memesan ulang untuk mencetak dimensi terlebih dahulu

  3. gunakan awkuntuk menguji angka pertama (tinggi gambar) memastikan lebih besar dari 500 dan jika itu adalah dimensi cetak dan nama file, jika tidak melakukan apa-apa.

h3rrmiller
sumber
Terima kasih. Saya memang harus melakukan sedikit perubahan - $ 1 dalam argumen awk menjadi $ 3. Tapi ini jelas untukku.
steve-er-rino
12
exiftool -q -r -ext png -if '$ImageHeight > 500' -p '$Directory/$FileName' .
Stéphane Chazelas
sumber
5

Saya merasa bahwa sesuatu selain utilitas shell akan lebih tepat, misalnya, 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 );

}

Kurang bergaul dengan mencoba untuk mengurai $ 7; dapatkan dimensi secara langsung. Ya, Anda memerlukan modul Image :: Info, tetapi, pada CentOS / RHEL, ini adalah paket standar, jadi Anda bisa menjalankannya yum install perl-Image-Info.

cjc
sumber
1
Walaupun perl biasanya merupakan solusi yang hebat, perl tidak dalam kasus ini, terutama karena saya tidak memiliki Image :: Info atau opsi untuk menginstal.
steve-er-rino
1
Solusi perl agak lebih cepat daripada find / file / awk, yang bagus, dan di ubuntu apt-get install libimage-info-perl
derivasi
5

Anda juga dapat menggunakan identifydari ImageMagick:

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

Atau di OS X:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .
Lri
sumber
0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'
Tink
sumber
tidak berfungsi: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, masukkan $ 7 ke int sebelum perbandingan, yaitu int ($ 7)> 500 .. dengan tidak adanya casting awk beralih ke perbandingan string literal
iruvar
Steve, dari mana "," itu berasal? "File" saya tidak menghasilkan itu. Tetapi seperti yang dikatakan Chandra: Anda dapat secara eksplisit memaksa $ 7 untuk menjadi bilangan bulat menggunakan metode yang ditunjukkan dalam komentarnya.
tink
pernyataan awk Anda hanya akan berfungsi jika nama file tidak memiliki spasi di dalamnya
h3rrmiller
@tink the "," adalah bagian dari file yang dikembalikan di lingkungan saya.
steve-er-rino
0

Solusi ini juga akan berfungsi. Bagian terakhir dari kode ( mv "$img" ./lowpixel) akan memindahkan file di bawah lebar dan tinggi yang ditentukan ke folder. Dalam contoh berikut, semua gambar jpg di bawah 300x300 akan dipindahkan ke folder bernama 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

whitewings
sumber