Archiv für den Monat: Juli 2008

Verschiebe JPG-Dateien in Datumsorientierte Unterordner

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}