Antworten:
Ich habe keine Ahnung, wie dies funktioniert, aber ImageMagick hat eine identify
Anwendung, die ich in den letzten zehn Minuten lernen muss. Besser als alles andere hat es ein -format
Argument, wo man rechnen kann!
find -iname '*.jpg' -exec identify -format "%[fx:w*h] %i\n" {} \+ | sort -g
Wenn Sie eine bestimmte Größe überschreiten, erhalten Sie leider eine wissenschaftliche Notation (z. B. 1,2 * 10 ^ 3) anstelle einer Ganzzahl, die von identify zurückgesetzt wird. Zum Glück hat sort ein -g
Argument, das sie auswerten wird.
Bei denselben Dateien dauert diese Version (nicht für Perl) nur 60% der Zeit, die die Perl-Version benötigt. Das heißt nicht, dass Perl langsam ist, aber es ist eine unnötige Komplikation, die die Dinge verlangsamt (glaube ich), in Perl einzusteigen und das Subshelling wieder aufzunehmen.
Meins ist immer noch nicht ideal. Das Sortieren von Zahlen in Ganzzahlen zum Sortieren ist ziemlich langsam. Idealerweise würden Sie dies alles intern in einer Sprache tun, wobei die Größe durchgehend als Ganzzahl bleibt ... Aber das Obige ist der kürzeste und schärfste Einzeiler, den ich machen kann.
LC_ALL=C
damit funktioniert es wie erwartet.
Wenn Sie nach einem Befehlszeilentool suchen, sortiert der folgende Befehl Bilddateien, bei denen die höchste Auflösung an erster Stelle steht:
find . -iname "*.png" -o -iname "*.jpg" | perl -e '$f=sub{eval(`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`)};print sort{$f->($b)<=>$f->($a)}<>'
Ich sortiere die Dateien im Grunde genommen mit der Sub-Subroutine perl
sort, wobei der Schlüssel hier darin besteht, den identify
Befehl aufzurufen und seine formatierte Ausgabe auszuwerten.
identify
ist mit dem imagemagick
Paket erhältlich:
sudo apt-get install imagemagick
UPDATE :
Der folgende Befehl gibt auch die Auflösung aus:
find . -iname "*.png" -o -iname "*.jpg" | perl -e '$f=sub{`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`};chomp&&print "$_\t".$f->($_) for sort{eval($f->($b))<=>eval($f->($a))}<>'
Beispiel:
./foo bar.png 1600*900
./baz.png 1600*900
./img_0004.jpg 1280*720
./img_0006.jpg 1280*720
./img_0001.jpg 1280*720
./img_0003.jpg 1280*720
./img_0002.jpg 1280*720
./img_0005.jpg 1280*720
./launcher.png 385*632
./textfield.png 402*329
./foo2.png 202*229
identify.im6: unable to open image ./estrada: No such file or directory @ error/blob.c/OpenBlob/2638. identify.im6: no decode delegate for this image format ./estrada @ error/constitute.c/ReadImage/544.
' Wenn das wichtig ist, enthalten Dateinamen keine Leerzeichen.
find
Befehl korrekt verwenden, um nur Bilder zu filtern. Andernfalls identify
schlägt dieser Fehler fehl. Ich habe es bekommen, als ich es versuchtefind . -iname "*"
find . -iname "*.png" -o -iname "*.jpg" | perl -e '$f=sub{`identify -format %w*%h ${\quotemeta(shift)} 2>/dev/null`};chomp&&print "$_\t".$f->($_)."\n" for sort{eval($f->($b))<=>eval($f->($a))}<>'
find
, file --mime-type
, identify
, awk
undsort
Mit file --mime-type
finden wir alle Bilder , auch ohne Erweiterung.
Die einzeilige Zeile am Ende dieser Antwort weist ein Problem mit Zeilenumbrüchen im Dateinamen auf. Deshalb hier eine andere Version:
find . -type f -exec sh -c 'file --brief --mime-type "$0" |\
grep -q ^image/ && identify -format "%[fx:w*h] %i\n" "$0"' {} \; |\
sort -g
Beispielausgabe
26696 ./OWoHp.png
37975 ./hUXnc.png
47275 ./foo
bar.png
Dies ist die Datei mit dem Zeilenumbruch im Dateinamen:
47275 ./foo
bar.png
Vielen Dank an @terdon , @don_crissti und @glennjackman für die Antworten hier .
Alte Version mit einem Problem, wenn der Dateiname Zeilenumbrüche enthält
find . -type f -print0 | \
xargs -0 -I{} file --mime-type {} | \
awk -F$"\0" -F": " '/image/ {print $1}' | \
xargs -I{} identify -format "%[fx:w*h] %i\n" {} | \
sort -g
Beispielausgabe
9216 ./.face
27918 ./Unbenannt.png
1.0368e+06 ./Images/Wallpapers/14-13.jpg
1.57292e+07 ./Images/Wallpapers/wallpaper_19.jpg
1.57292e+07 ./Images/Wallpapers/wallpaper_22.jpg
1.92e+06 ./Images/Wallpapers/black (10).jpg
2.304e+06 ./Images/Wallpapers/1920x1200.jpg
2.304e+06 ./Images/Wallpapers/1920x1200_Seria_Lunar-Melodies.png
2.304e+06 ./Images/Wallpapers/Anime_girl_129177.jpg
2.304e+06 ./Images/Wallpapers/wallpaper-1802661.jpg
2.304e+06 ./Images/Wallpapers/wallpaper-264390.jpg
3.14368e+06 ./Images/Wallpapers/14 - 2.jpg
3.6864e+06 ./Images/Wallpapers/14-1.jpg
4.096e+06 ./Images/Wallpapers/wallpaper-2850337.jpg
4.096e+06 ./Images/Wallpapers/wt4NRqA.jpg
7.0969e+06 ./Images/Wallpapers/14 - 1.png
Spät zur Party , aber hier ist meine Version mit find
, exiftool
und sort
:
find . -exec exiftool -S -t -q -FileName -ImageSize {} + | sort -k2n,2
Es ist etwas langsam, funktioniert aber. Beispielausgabe:
$ find Downloads -exec exiftool -S -t -q -FileName -ImageSize {} + | sort -k2n,2
1433695350670.jpg 1600x1000
1433695350670.jpg 1600x1000
1434999385912.jpg 2212x3318
1434999385912.jpg 2212x3318
1433524966694.jpg 2688x1520
1433524966694.jpg 2688x1520
1433525301504.jpg 2688x1520
1433525301504.jpg 2688x1520
sort -g
mit der wissenschaftlichen Notation richtig umgehen? Ich frage, weil(echo 1.45e+06; echo 1.15e+06; echo 1.44e+06; echo 5; echo 2) | sort -g
eine merkwürdige Bestellung zurückgibt (ich habe mit Bash getestet)