Trova immagini per dimensione: trova / file / awk


9

Ho cercato di trovare file di immagine png di una certa altezza (oltre 500px). So che filerestituirà le dimensioni dell'immagine. Esempio:

$ file TestImg1a.png

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

Ma devo usarlo per trovare tutti i file in una directory con un'altezza superiore a 500px. So come stampare tutti i file indipendentemente dall'altezza:

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

Ma come posso limitare $ 7 a quei risultati superiori a 500?

Risposte:


7

so che questo è un po 'eccessivo, ma funzionerà ogni volta (anche se ci sono spazi nel tuo nome file) e indipendentemente da come il file visualizza le informazioni.

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

e stampa le dimensioni dell'immagine e del file

spiegazione:

  1. findtutti i file chiamati * .png sotto. e per ognuno fare un file su di esso

  2. utilizzare sedper stampare solo il nome file e le dimensioni, quindi riordinare per stampare prima le dimensioni

  3. usare awkper testare il primo numero (altezza dell'immagine) assicurandosi che sia maggiore di 500 e se si tratta di dimensioni di stampa e nome del file, in caso contrario non fare nulla.


Grazie. Ho dovuto apportare una leggera modifica: $ 1 nell'argomento awk a $ 3. Ma questo è decisamente per me.
steve-er-rino,


5

Sento che qualcosa di diverso dalle utility di shell sarebbe più appropriato, ad esempio 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 );

}

Meno schivate in giro con il tentativo di analizzare $ 7; ottieni direttamente le dimensioni. Sì, avrai bisogno del modulo Image :: Info, ma, su CentOS / RHEL, è un pacchetto standard, quindi puoi semplicemente eseguirlo yum install perl-Image-Info.


1
Mentre perl è normalmente un'ottima soluzione, non è in questo caso, specialmente perché non ho Image :: Info né l'opzione per l'installazione.
steve-er-rino,

1
La soluzione perl è un po 'più veloce di find / file / awk, il che è carino, e su Ubuntu deriva il modulo di informazioni sull'immagine è disponibile daapt-get install libimage-info-perl
rivimey

5

Puoi anche usare identifyda ImageMagick:

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

O in 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}'

non funziona: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, esegui $ 7 su un int prima del confronto, ovvero int ($ 7)> 500 .. in assenza di casting awk sta ricorrendo a un confronto letterale di stringhe
iruvar

Steve, da dove viene ","? Il mio "file" non lo produce. Ma come ha detto Chandra: puoi forzare esplicitamente $ 7 a diventare un numero intero usando il metodo indicato nel suo commento.
tink

la tua dichiarazione awk funzionerà solo se il nome del file non contiene spazi
h3rrmiller

@tink "," fa parte di ciò che il file restituisce nel mio ambiente.
steve-er-rino,

0

Questa soluzione funzionerà anche. L'ultima parte del codice ( mv "$img" ./lowpixel) sposta i file al di sotto della larghezza e dell'altezza specificate in una cartella. Nel seguente esempio tutte le immagini jpg inferiori a 300x300 verranno spostate in una cartella denominata 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.