[gelöst] JPG nach Pixelgröße suchen und verschieben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

[gelöst] JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 11:44:21

Hi, ich möchte Screenshots aus 150k Fotos finden und in einen anderen Ordner verschieben.

Mein aktuelles Script funktioniert leider nicht:

Code: Alles auswählen

find ./JPG -name "*.jpg" -exec bash -c "sips -g pixelHeight -g pixelWidth {} | grep '2220' >/dev/null" \; -exec mv {} ./screenshots \; 
Immerhin keine Fehlermeldung, aber es wird auch nichts verschoben.

Ich vermute, dass "sips" in einer eigenen Shell läuft und daher der Output nicht weiterverwendet werden kann.

Lösungsansätze:

1. ein tmp File nutzen
2. eine Export-Variable nutzen
3. das o.g. Kommando umbauen

Da ich jetzt nicht soooo fit bin, könntet ihr mir dabei bitte helfen (1, 2 oder 3)?

Ich möchte dafür auch gerne Bordmittel nutzen, keine extra zu installierenden Bibliotheken.

Danke vorab!
Zuletzt geändert von bivvo am 22.07.2022 16:57:42, insgesamt 1-mal geändert.

rodney
Beiträge: 370
Registriert: 09.12.2016 04:15:59

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von rodney » 16.09.2021 12:15:13

Warum sips (OSX) und nicht etwas anderes aus den Debian-Paketquellen?
Was ist die Ausgabe von sips -g pixelHeight -g pixelWidth bilddatei.jpg?
Du willst nur Bilddateien mit genau 2220 Pixel Hoehe oder genau 2220 Pixel Breite verschieben?

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 12:18:38

Hi, alle Bilder mit Höhe exakt 2220px.
Ein einzelnes Bild sagt mir: "not a valid file - skipping" - obwohl jpg und nicht kaputt o.ä.

rodney
Beiträge: 370
Registriert: 09.12.2016 04:15:59

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von rodney » 16.09.2021 12:44:09

Mittels identify aus dem Paket Debianimagemagick (ungetestet):

Code: Alles auswählen

for file in $(find ./JPG -name "*.jpg"); do
	img_height=$(identify -ping -format "%h" "${file}")
	if [ ${img_height} = 2220 ]; then
		mv "${file}" ./screenshots
	fi
done

Benutzeravatar
hikaru
Moderator
Beiträge: 13896
Registriert: 09.04.2008 12:48:59

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von hikaru » 16.09.2021 12:50:07

rodney hat geschrieben: ↑ zum Beitrag ↑
16.09.2021 12:15:13
Warum sips (OSX) und nicht etwas anderes aus den Debian-Paketquellen?
Geht das überhaupt? OSX-Programme unter Linux ausführen?
Falls es Binaries sind würde ich vermuten, das ginge nicht. Falls sips ein Script ist, könnte es gehen. Jedenfalls wäre so ein Fremdprogramm für mich das genaue Gegenteil der Definition von "Bordmittel".

Mit Debianexiftool geht das:

Code: Alles auswählen

$ find ./JPG -name "*.jpg" -exec bash -c "exiftool -csv -s -ImageSize {} | grep > /dev/null 'x959'" \; -exec mv {} .screenshots/ \;
Rohausgabe von exiftool:

Code: Alles auswählen

$ ls JPG/
20191209_001b.jpg  20191209_002b.jpg  20191209_003b.jpg  20191209_004b.jpg  20191209_005b.jpg  20191209_006b.jpg  20191209_007.jpg
$ exiftool -csv -s -ImageSize JPG/*.jpg
SourceFile,ImageSize
JPG/20191209_001b.jpg,2592x1968
JPG/20191209_002b.jpg,2592x1968
JPG/20191209_003b.jpg,2592x1968
JPG/20191209_004b.jpg,2592x1968
JPG/20191209_005b.jpg,2592x1968
JPG/20191209_006b.jpg,2592x1968
JPG/20191209_007.jpg,890x959
    7 image files read

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 12:52:36

Danke! Probiere ich aus. :THX:

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von tobo » 16.09.2021 12:55:32

bivvo hat geschrieben: ↑ zum Beitrag ↑
16.09.2021 11:44:21

Code: Alles auswählen

find ./JPG -name "*.jpg" -exec bash -c "sips -g pixelHeight -g pixelWidth {} | grep '2220' >/dev/null" \; -exec mv {} ./screenshots \; 
Immerhin keine Fehlermeldung, aber es wird auch nichts verschoben.
Zu sips kann ich inhaltlich nichts sagen, aber du suchst nach 2220 und wirfst das dann weg - Ausgabe gibt's da somit für das 1. exec keine! Verschoben (2. exec) wird nur, wenn das 1. exec einen positiven Rückgabewert hat. Soll es immer verschieben, dann:

Code: Alles auswählen

find ./JPG -name "*.jpg" \( -exec bash -c "sips -g pixelHeight -g pixelWidth {} | grep '2220' >/dev/null" \; -o -true \) -exec mv {} ./screenshots \;
Zuletzt geändert von tobo am 16.09.2021 12:57:59, insgesamt 1-mal geändert.

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 12:57:38

hikaru hat geschrieben: ↑ zum Beitrag ↑
16.09.2021 12:50:07
Geht das überhaupt? OSX-Programme unter Linux ausführen?
Erwischt! :D Habe noch einen anderen Rechner zur Hand mit Debian, wo ich ein Script drüber laufen lassen kann, mittels Samba-Freigaben etc. Das probiere ich gerne mit Debianexiftool aus. Danke.

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 13:25:44

hikaru hat geschrieben: ↑ zum Beitrag ↑
16.09.2021 12:50:07
Mit Debianexiftool geht das:

Code: Alles auswählen

$ find ./JPG -name "*.jpg" -exec bash -c "exiftool -csv -s -ImageSize {} | grep > /dev/null 'x959'" \; -exec mv {} .screenshots/ \;
exiftool erfolgreich getestet, aber der find-Befehl mit dem Verschieben funktioniert irgendwie noch nicht. Ich drücke ENTER und dann erscheinen nur > am Anfang der jeweils nächsten Zeile:

Code: Alles auswählen

sudo find ./JPG8 -name "*.jpg" -exec bash -c "sudo exiftool -csv -s -ImageSize {} | grep > /dev/null 'x2220‘“ \; -exec mv {} ./screenshots/ \;
> 
> 
> 
"sudo" deshalb, weil das Quell- und Ziellaufwerk gemounted sind.

Benutzeravatar
hikaru
Moderator
Beiträge: 13896
Registriert: 09.04.2008 12:48:59

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von hikaru » 16.09.2021 13:33:15

Die beiden Anführungszeichen hinter dem x2220 sind die falschen. Deshalb findet find die richtigen nicht.

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 13:52:39

yesss, it works! danke dir! :THX:

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 14:06:52

bivvo hat geschrieben: ↑ zum Beitrag ↑
16.09.2021 13:25:44
exiftool erfolgreich getestet, aber der find-Befehl mit dem Verschieben funktioniert irgendwie noch nicht. Ich drücke ENTER und dann erscheinen nur > am Anfang der jeweils nächsten Zeile:

Code: Alles auswählen

sudo find ./JPG8 -name "*.jpg" -exec bash -c "sudo exiftool -csv -s -ImageSize {} | grep > /dev/null 'x2220'" \; -exec mv {} ./screenshots/ \;
Ich hab noch eine Herausforderung: es sind mehrere JPG-Ordner (JPG8, JPG9 .. JPG150 usw.).

Wie lasse ich die automatisch der Reihe nach durchlaufen?

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von tobo » 16.09.2021 17:49:15

Für ein Verzeichnis und dessen Unterverzeichnis:

Code: Alles auswählen

sudo find ./JPG8 -name "*.jpg" -exec bash -c 'sudo exiftool -csv -s -ImageSize "{0}" | grep > /dev/null "x2220"' {} \; -exec mv {} ./screenshots/ \;
Für vorgegebene Verzeichnisse und deren Unterverzeichnisse:

Code: Alles auswählen

for dir in dir1 "dir 2" dir3; do sudo find "$dir" -name "*.jpg" -exec bash -c 'sudo exiftool -csv -s -ImageSize "{0}" | grep > /dev/null "x2220"' {} \; -exec mv {} ./screenshots/ \; ;done
Unterverzeichnisse ausschließen per find-Schalter (-maxdepth 1).
Quoting beachten!
Zuletzt geändert von tobo am 16.09.2021 23:25:47, insgesamt 1-mal geändert.

bivvo
Beiträge: 47
Registriert: 16.09.2021 11:40:12

Re: JPG nach Pixelgröße suchen und verschieben

Beitrag von bivvo » 16.09.2021 20:04:33

Merci - läuft! :)

Antworten