#! /bin/bash # (c) Christian Boltz - http://www.cboltz.de # Dieses Script unterliegt der GPL. usage="Usage: `basename $0` Verzeichnis_alt Verzeichnis_neu Verzeichnis_fuer_diffs Verzeichnis_alt: Ausgangsverzeichnis Verzeichnis_neu: geändertes Verzeichnis Verzeichnis_fuer_diffs: Verzeichnis, in dem geänderte Dateien abgelegt werden sollen " if test "x$#" != "x3"; then echo "$usage"; exit 1; fi VERZALT="$1" VERZNEU="$2" VERZDIFFS="$3" CP="cp" MKDIR="mkdir -p" # DEBUG="ON" # Diff-Zeile und CP/MKDIR-Befehle mit ausgeben, wenn einkommentiert # oder DEBUG=ON in der Shell gesetzt # z. B. Aufruf mit DEBUG=ON diffdirs ..... if [ -n "$DEBUG" ]; then CP="echo -> "$CP ; MKDIR="echo -> "$MKDIR ; fi; # mögliche Ausgaben von diff: # Only in /tmp/verz_a/: test # Files /tmp/verz_a/test3 and /tmp/verz_b/test3 differ # Only in /tmp/verz_a/verz_a1: muster # falls $1 = "Files" -> Datei geändert -> $2 ins Changed-Verzeichnis # falls $1 = "Only" und $3 = "VERZNEU" -> neue Datei -> $4 ins Changed-Verz. # falls $1 = "Only" und $3 = "VERZALT" -> gelöschte Datei -> Hinweis ausgeben ################### VERZEICHNISINHALT VERGLEICHEN ################################################ LANG=en diff -r -q $VERZALT/ $VERZNEU/ | while read Zeile; do set -- $Zeile if [ -n "$DEBUG" ]; then echo "$@" # Ausgabe von diff anzeigen fi; case "$1" in ################### DATEI GEÄNDERT ############################################################### Files) SUBDIR="${2%\/*}" if [ -n "${SUBDIR}" ]; then SUBDIR=${SUBDIR}/ ; fi; SUBDIR=${SUBDIR#$VERZALT/} FILENAME="${2##*\/}" if [ ! -d ${VERZDIFFS}/${SUBDIR} ]; then # bei Bedarf Verzeichnis anlegen $MKDIR ${VERZDIFFS}/${SUBDIR} ; fi; $CP $4 $VERZDIFFS/$SUBDIR$FILENAME ;; ################### DATEI NUR IN EINEM VERZEICHNIS ############################################### Only) ################### DATEI NUR IN $VERZALT -> GELÖSCHT-> HINWEISTEXT ############################# if [ ${3:0:${#VERZALT}} == $VERZALT ] ; then echo -n "*** Datei gelöscht: "; SUBDIR="${3:${#VERZALT}+1}"; SUBDIR="${SUBDIR:0:${#SUBDIR}-1}"; ### verursacht parse error (syntax heighlighting) in vim ### test -n "${SUBDIR}" && \ echo -n "$SUBDIR/"; # evtl. Name des Unterverzeichnis sowie... echo "$4"; # ... auf jeden Fall den Dateinamen ausgeben. ################### DATEI NUR IN $VERZNEU -> NACH $VERZDIFFS KOPIEREN ########################## elif [ ${3:0:${#VERZNEU}}==$VERZNEU ]; then SUBDIR=${3:${#VERZNEU}+1}; SUBDIR=${SUBDIR:0:${#SUBDIR}-1}; ### verursacht parse error (syntax highlighting) in vim ### if [ -n "${SUBDIR}" ]; then SUBDIR=${SUBDIR}/ ; fi; if [ ! -d ${VERZDIFFS}/${SUBDIR} ]; then # bei Bedarf Verzeichnis anlegen $MKDIR ${VERZDIFFS}/${SUBDIR} ; fi; $CP -R $VERZNEU/${SUBDIR}${4} $VERZDIFFS/${SUBDIR}${4} ; # Only in ... kann auch Verzeichnisse liefern, deshalb -R ##### sonstiges (sollte nicht vorkommen) else echo "Unbekannte Diff-Ausgabe :-( (if-Block)" >&2; echo "$@" exit 1; fi ;; ##### sonstiges (sollte nicht vorkommen) *) echo "Unbekannte Diff-Ausgabe :-( (case-Block)" >&2; echo "$@" exit 1 ;; esac; done; exit 0;