Suchen Sie Bilder nach Größe: find / file / awk

9

Ich habe versucht, PNG-Bilddateien mit einer bestimmten Höhe (über 500 Pixel) zu finden. Ich weiß, dass dies fileBildabmessungen zurückgibt. Beispiel:

$ file TestImg1a.png

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

Aber ich muss dies verwenden, um alle Dateien in einem Verzeichnis mit einer Höhe über 500px zu finden. Ich kann alle Dateien unabhängig von der Höhe ausdrucken:

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

Aber wie beschränke ich die 7 US-Dollar auf Ergebnisse über 500?

steve-er-rino
quelle

Antworten:

7

Ich weiß, dass dies ein bisschen übertrieben ist, aber dies wird jedes Mal funktionieren (auch wenn Ihr Dateiname Leerzeichen enthält) und unabhängig davon, wie die Datei die Informationen anzeigt.

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

und es druckt die Abmessungen des Bildes und der Datei

Erklärung:

  1. findAlle Dateien mit dem Namen * .png unter. und für jeden eine Datei darauf machen

  2. Verwenden Sie seddiese Option, um nur den Dateinamen und die Abmessungen zu drucken, und ordnen Sie sie dann neu an, um zuerst die Abmessungen zu drucken

  3. Verwenden Sie awkdiese Option, um die erste Zahl (Bildhöhe) zu testen. Stellen Sie dabei sicher, dass sie größer als 500 ist. Wenn es sich um Druckabmessungen und Dateinamen handelt, tun Sie nichts.

h3rrmiller
quelle
Vielen Dank. Ich musste eine kleine Änderung vornehmen - die $ 1 im awk-Argument auf $ 3. Aber das hat es definitiv für mich.
Steve-er-Rino
12
exiftool -q -r -ext png -if '$ImageHeight > 500' -p '$Directory/$FileName' .
Stéphane Chazelas
quelle
5

Ich bin der Meinung, dass etwas anderes als Shell-Dienstprogramme angemessener wäre, z. B. 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 );

}

Weniger herumhüpfen mit dem Versuch, $ 7 zu analysieren; Holen Sie sich einfach die Abmessungen direkt. Ja, Sie benötigen das Image :: Info-Modul, aber unter CentOS / RHEL ist es ein Standardpaket, sodass Sie es einfach ausführen können yum install perl-Image-Info.

cjc
quelle
1
Perl ist normalerweise eine großartige Lösung, aber in diesem Fall nicht, zumal ich weder Image :: Info noch die Option zur Installation habe.
Steve-Er-Rino
1
Die Perl - Lösung ist etwas schneller als die find / file / awk ein, was schön ist, und auf ubuntu das Bild Info - Modul Derivaten ist vonapt-get install libimage-info-perl
rivimey
5

Sie können auch identifyvon ImageMagick aus Folgendes verwenden:

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

Oder in OS X:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .
Lri
quelle
0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'
basteln
quelle
funktioniert nicht: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, wirf $ 7 vor dem Vergleich in ein int, dh int ($ 7)> 500 .. in Abwesenheit von Casting greift awk auf einen wörtlichen String-Vergleich zurück
iruvar
Steve, woher kommt das ","? Meine "Datei" produziert das nicht. Aber wie Chandra sagte: Sie können $ 7 explizit zwingen, eine ganze Zahl zu werden, indem Sie die in seinem Kommentar beschriebene Methode verwenden.
Tink
Ihre awk-Anweisung funktioniert nur, wenn der Dateiname keine Leerzeichen enthält
h3rrmiller
@tink das "," ist Teil dessen, was die Datei in meiner Umgebung zurückgibt.
Steve-er-Rino
0

Diese Lösung wird auch funktionieren. Der letzte Teil des Codes ( mv "$img" ./lowpixel) verschiebt Dateien unterhalb einer bestimmten Breite und Höhe in einen Ordner. Im folgenden Beispiel werden alle JPG-Bilder mit einer Größe von weniger als 300 x 300 in einen Ordner mit dem Namen verschoben 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

user8547
quelle