Ich habe auf einem Linux-Rechner ein „Eingangs-Verzeichnis“, welches von unterschiedlichen Usern per samba-Dateifreigabe mit JPG-Dateien gefüllt wird. Diese sollen automatisch in eine zeitorientierte Ordnerstruktur übergeben werden.
Die Bilder werden zunächst aufgrund der Angabe im Bild gedreht, dann wird das EXIF-Datum ausgelesen und der Pfad aufgebaut. Das Bild wird umbenannt und auch sichergestellt, dass Bilder nicht überschrieben werden, da es inzwischen Digitalkameras gibt, welche mehrere Bilder in der gleichen Sekunde schießen können.
Es ist von mir vor langer Zeit geschrieben worden und könnte ein paar Optimierungen vertragen, insbesondere da mir nun auch eine leistungsfähige bash-Shell zur Verfügung steht. Auf dem ursprünglichen System gab es nur eine busybox, welche noch nicht einmal vernünftig rechnen konnte, daher auch der Aufruf zu „bc“.
Das Skript steht auch zum Download bereits: moveJPG.sh
#!/bin/bash # # Verschiebt alle JPG-Bilder im aktuellen Verzeichnis nach: # /data/Bilder/2008/20080705/20080705_145232_1.JPG # ^^^^^^^^^^^ ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^ # Grundverz. Jahr Datum Datum Zeit Seq. (falls bereits vorhanden) # # Die Werte Jahr/Datum/Zeit werden aus den EXIF-Daten des Bildes gelesen! # Autorotation wird ebenfalls durchgeführt, falls erforderlich. # # Voraussetzung ist jhead und exifprobe (exifgrep ist in exifprobe) # Auf einem aktuellen Ubuntu sind diese als Pakete in den Standardquellen # vorhanden: # apt-get update && apt-get install jhead exifprobe pre=$1 # Only files with this prefix targetpath="/data/Bilder" sourcepath="/data/in" jheadp="/usr/bin/jhead" exifgrepp="/usr/bin/exifgrep" exifprobep="/usr/bin/exifprobe" md5prg="/usr/bin/md5sum" awkbin="/usr/bin/awk" nicebin="/usr/bin/nice" cd ${sourcepath} # Leerzeichen werden von exifgrep/exifprobe im Dateinamen nicht vernuenftig verwendet # Daher erst alle betroffenen Dateien von den Leerzeichen befreien find ${sourcepath} -name "* *" -type f | rename 's/ /_/g' for file in ${pre}*.JPG ${pre}*.jpg; do #for file in ${pre}*; do if [ -e "${file}" ]; then seq=0 domove="" ${nicebin} -n 19 ${jheadp} -autorot "${file}" 2>&1 | grep -v "Nonfatal Error" fullgrep=`PROBE=${exifprobep} ${exifgrepp} DateTimeOriginal "${file}" | \ ${awkbin} '{ print $3 ":" $4 }' | \ sed s/\'//g` year=`echo $fullgrep | ${awkbin} -F':' '{ print $1 }'` if [ "${year}" = "" ]; then echo "$file has no EXIF" domove="NO" else fulldate=`echo $fullgrep | ${awkbin} -F':' '{ print $1 $2 $3 }'` datetime=`echo $fullgrep | ${awkbin} -F':' '{ print $1 $2 $3 "_" $4 $5 $6 }'` fi while [ -e "${targetpath}/${year}/${fulldate}/${datetime}_${seq}.JPG" ]; do md5t=`$md5prg "${targetpath}/${year}/${fulldate}/${datetime}_${seq}.JPG" |\ ${awkbin} '{ print $1 }'` md5s=`$md5prg "${file}" | ${awkbin} '{ print $1 }'` if [ $md5s = $md5t ]; then echo "$file exists (${datetime}_${seq}.JPG)" domove="NO" break else seq=`echo ${seq} + 1 | bc` fi done if [ "${domove}" = "" ]; then echo -e "${file}" '\t->' "${targetpath}/${year}/${fulldate}/${datetime}_${seq}.JPG" mkdir -p "${targetpath}/${year}/${fulldate}/" mv "${file}" "${targetpath}/${year}/${fulldate}/${datetime}_${seq}.JPG" fi fi done # Berechtigungen freigeben chown -R nobody:nogroup ${targetpath} chmod -R a+rwx ${targetpath}