Bilder im JPEG-Format nach Größe und EXIF-Informationen sortieren und umbenennen
Nach der wegen meiner eigenen Doofheit fälliggewordenen Datenrettungsaktion habe ich nun eine Unmenge unsortierter Fotos im JPEG-Format auf der Platte.
Wenn schon meine Doofheit Schuld an dieser Lage ist, muss ich halt etwas mehr Gehirnschmalz investieren, um dieser einigermaßen Herr zu werden.
Eins ist von vornherein klar: Ohne eine automatische Sortierung komme ich nicht weiter.
Zum Glück hat Linux ja schon alles „an Bord”, was ich dafür brauche.
Hauptsächlich geht es mir ja um meine selbst aufgenommenen Fotos. Daher habe ich mich entschieden, die Bilder zuerst einmal nach der Angabe des Kameramodells in den EXIF-Tags in verschiedene Verzeichnisse zu sortieren und die Dateien jeweils anhand des ebenfalls per EXIF in der Datei enthaltenen Aufnahmedatums umzubenennen.
Wenn keine EXIF-Informationen in der Datei vorhanden ist, wird sie entsprechend ihrer Bildgröße in einen Ordner einsortiert.
Dies erledigt das folgende kleine Bash-Skript (quick&dirty, aber ich stelle es hier dennoch rein, für den Fall, dass es noch jemand anderem behilflich sein kann):
#!/bin/bash # JPEG-Dateien nach Kamera-Modell und Aufnahmedatum sortieren for F in *; do # Statusmeldung kann nie schaden: echo "Processing File $F..." MAGIC=`file "$F"`; # inhaltsbasiert bestimmen, um was für einen Dateityp es sich handelt # handelt es sich um eine JPEG-Datei? if [[ $MAGIC =~ "JPEG" ]]; then if [[ $MAGIC =~ "EXIF" ]]; then # file has EXIF info... # HERST=`exif --ifd=0 --tag 0x010e -m "$F"` # für einige Kameras nicht definiert, kostet nur Zeit... # echo " Hersteller: $HERST" MODEL=`exif --ifd=0 --tag 0x0110 -m "$F"` echo " Modell: $MODEL" DATETIMEORIG=`exif --ifd=EXIF --tag 0x9003 -m "$F"` echo " DateTimeOriginal: $DATETIMEORIG" IFS=" " values=( $DATETIMEORIG ) EXIF_DATE=${values[0]} EXIF_TIME=${values[1]} IFS=":" values=( $EXIF_DATE ) EXIF_YEAR=${values[0]} EXIF_MONTH=${values[1]} EXIF_DAY=${values[2]} values=( $EXIF_TIME ) EXIF_HOUR=${values[0]} EXIF_MINUTE=${values[1]} EXIF_SECOND=${values[2]} IFS=" " TIME_NEW="${EXIF_YEAR}-${EXIF_MONTH}-${EXIF_DAY} ${EXIF_HOUR}.${EXIF_MINUTE}.${EXIF_SECOND}" echo " DateTime f. Name: $TIME_NEW" NEWDIR="$MODEL"; NEWNAME="$TIME_NEW ${F}.JPG" DEST="${NEWDIR}/${NEWNAME}" # move the file to subfolder and rename it mkdir -p "$NEWDIR" MOVERES=`mv -v "$F" "$DEST"` echo " $MOVERES" else # file has no EXIF info echo " No EXIF info found." # jpeginfo aufrufen, um an Dimensionen des Bildes zu kommen JPEGINFO=`jpeginfo "$F"`; echo " $JPEGINFO"; if [[ $JPEGINFO =~ "ERROR" ]]; then # jpeginfo gab Fehler aus => keine Info über Bilddimensionen NEWDIR="jpeginfo-ERROR"; else WIDTH=$(echo $JPEGINFO | sed 's/.*[[:space:]]\([[:digit:]]*\)[[:space:]]x[[:space:]]\([[:digit:]]*\).*/\1/') HEIGHT=$(echo $JPEGINFO | sed 's/.*[[:space:]]\([[:digit:]]*\)[[:space:]]x[[:space:]]\([[:digit:]]*\).*/\2/') echo " Dimension: $WIDTH x $HEIGHT" NEWDIR="noEXIF-${WIDTH}x${HEIGHT}"; fi NEWNAME="${F}.JPG" DEST="${NEWDIR}/${NEWNAME}" # move the file to subfolder and rename it mkdir -p "$NEWDIR" MOVERES=`mv -v "$F" "$DEST"` echo " $MOVERES" fi echo # Leerzeile für Übersichtlichkeit fi done;

Ein Durchlauf des Programms recoverjpeg (mit dem Aufruf “recoverjpeg -b 1 -m 10m formatierte_platte.img”) benötigte im Hintergrund ca. 3 1/2 Stunden und lieferte 602 358 “wiederhergestellte” Bilder. Darin enthalten sind allerdings sämtliche Einzelframes z.B. aus den mit der kompakten Digitalkamera aufgenommenen Videos, da diese in einem QuickTime-Container im M-JPEG-Format abgespeichert werden.
Ohne eine geschickte Vorsortierung wäre das wohl eine Menge Arbeit, diese Massen an Bildern zu sichten.