Wie finde ich alle Bilder mit einer bestimmten Pixelgröße über die Kommandozeile?

16

Ich versuche, alle JPG-Bilder in einem Ordner mit Unterordnern zu finden, deren Breite oder Höhe unter 300px liegt.

Auf diese Weise möchte ich alte Thumbnails erkennen und löschen.

Natürlich kann ich alle Bilder finden mit find:

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

Aber was folgt nach der Pfeife? Welches Paket kann ich verwenden, um Bildattribute zu erkennen?

mcbetz
quelle

Antworten:

17

Sie können identifyfrom imagemagickund den folgenden Befehl verwenden:

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

Durch die Verwendung von -exec <command> '{}' \;wird sichergestellt, dass Ihr Dateiname Leerzeichen enthalten kann. Alternativ können Sie auch verwenden

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

wo der -I{}sich um das selbe kümmert.

Mir gefällt, identifydass Sie das Ausgabeformat festlegen können. In diesem Fall werden '%w %h %i'die Breite, Höhe und der vollständige Pfadname des Bildes angegeben. Der awkAusdruck behält dann nur die Zeilen bei, für die das Bild kleiner als die gewünschte Größe ist.

Beispiel für die Ausgabe:

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

Bearbeiten: Wenn Sie nur die Dateinamen möchten (zum rmBeispiel für die Weiterleitung an ), ändern Sie einfach $linedie awkAnweisung in $3, dann wird nur die dritte Spalte gedruckt.

Gerhard Burger
quelle
3
Der awk-Teil kann kürzer gemacht werden: | awk '$1<300||$2<300'oder | awk '$1<300||$2<300{print $3}'(wenn nur die 3. Spalte benötigt wird).
Har-Wradim
@ har-wradim Danke, netter Vorschlag!
Gerhard Burger
6
Ich musste eine neue Zeile ( '%w %h %i\n') hinzufügen , damit es für mich funktioniert.
Qwr
1

Ich denke, die akzeptierte Antwort ist sehr gut, aber ich wollte eine andere mögliche Lösung hinzufügen ...

Obwohl ich ImageMagickheute meistens selbst Werkzeuge benutze , netpbmist das ein alter Freund für die Bildbearbeitung. Mit dem folgenden Befehl können Sie die Größe eines beliebigen Bildformats anzeigen:

anytopnm file | pamfile

Dadurch wird eine Ausgabe generiert, die wie folgt aussieht:

stdin:  PPM raw, 1650 by 1275  maxval 255

Zur Beantwortung der Frage "Was folgt nach der Pipe?" Verwende ich while readhäufiger als ich es verwende, xargsweil es flexibler ist. Meine netpbmAntwort auf die Frage sieht so aus:

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
NateT
quelle
1

Das hat bei mir funktioniert:

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

Dies ist das Ausgabebeispiel:

2520161636481000.png 75 x 75

./2620160819191100.png 75x75

./2420181545550700.png 75x75

osroflo
quelle
0

Der identifyBefehl aus dem imagemagickPaket macht was Sie wollen:

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

Auch hier müssten Sie dann verwenden grep, um die Bildgröße zu sortieren.

Ich vermute jedoch, dass es einfacher ist find, JPEG-Dateien unterhalb einer bestimmten Größe zu entfernen , wenn Sie nicht über einen sehr großen Bereich von Bildgrößen verfügen :

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

(Es lohnt sich, das Programm zu starten, ohne -deletevorher zu überprüfen, ob die gewünschten Elemente nicht gefunden wurden. Andernfalls werden Sie vor dem Löschen nicht dazu aufgefordert.)

Chronitis
quelle