Hallo David, hallo Leute,
Am Montag, 21. Januar 2002 22:23 schrieb David Haller:
On Mon, 21 Jan 2002, Christian Boltz wrote:
Am Sonntag, 20. Januar 2002 00:19 schrieb David Haller:
DIRNAME="${DATEI%\/*}"
BASENAME="${DATEI##*\/}"
Aber du hast dir dazu den Kommentar in meinem script durchgelesen,
gell?
Ja, aber betrachte Dir mal die Uhrzeit meiner lezten Mails ;-)
Ich bezog mich auf meine erste Mail in diesem Thread von '17.01.02
02:27:21' samt Korrektur in '17.01.02 04:51:00'. Deine naechste war
dann von '17.01.02 23:48:42', sollte dann doch gereicht haben ;)
Das Problem war nicht der Abstand zwischen den Mails, sondern die Uhrzeit an
sich ;-) Da Du auch ein "Nachtarbeiter" bist, kennst Du wohl die damit
verbundenen Probleme, oder?
So, dann werde ich wohl das Script fertigschreiben. Ich poste es dann in
den nächsten Tagen, da vielleicht noch mehr Leute Interesse daran haben.
Das waren jetzt ein paar paar ;-) Tage, ich hatte inzwischen einfach zuviel
zu tun. Aber: Was lange währt, wird endlich gut (hoffe ich zumindest...)
Mach dich auf Korrekturen gefasst ;)
Ich bitte darum ;-)
Kurz zum Aufruf:
$1 -> verz_alt: Verzeichnis mit altem Stand
$2 -> verz_neu: Verzeichnis mit Änderungen
$3 -> verz_fuer_diffs: hierhin werden geänderte Dateien kopiert
Dateien, die in verz_alt und verz_neu existieren und geändert wurden, werden
nach verz_fuer_diffs kopiert, ebenso Dateien, die nur in verz_neu existieren.
Dateien, die nur in verz_alt vorhanden sind, führen dazu, dass die Meldung
"Datei gelöscht: xxx" ausgegeben wird.
Statt einer Datei kann es sich jeweils auch um ein Verzeichnis handeln.
-----------------------------------------------------------
#! /bin/bash
# (c) Christian Boltz
# Dieses Script unterliegt den Bedingungen 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
VERZ_ALT="$1"
VERZ_NEU="$2"
VERZ_DIFFS="$3"
# CP="echo -> cp"
CP="cp"
# MKDIR="echo -> mkdir -p"
MKDIR="mkdir -p"
################### VERZEICHNISINHALT VERGLEICHEN ##############
diff -r -q $VERZ_ALT/ $VERZ_NEU/ |
while read Zeile; do
set -- $Zeile
case "$1" in
##### DATEI GEÄNDERT #####
Files)
SUBDIR="${2%\/*}"
if [ -n "${SUBDIR}" ]; then
SUBDIR=${SUBDIR}/ ;
fi;
SUBDIR=${SUBDIR#$VERZ_ALT/}
FILENAME="${2##*\/}"
if [ ! -d ${VERZ_DIFFS}/${SUBDIR} ]; then
# bei Bedarf Verzeichnis anlegen
$MKDIR ${VERZ_DIFFS}/${SUBDIR} ;
fi;
$CP $2 $VERZ_DIFFS/$SUBDIR$FILENAME
;;
##### DATEI NUR IN EINEM VERZEICHNIS #####
Only)
##### DATEI NUR IN $VERZ_ALT -> GELÖSCHT-> HINWEISTEXT #####
if [ ${3:0:${#VERZ_ALT}} == $VERZ_ALT ] ; then
echo -n "*** Datei gelöscht: ";
SUBDIR=${3:${#VERZ_ALT}+1};
SUBDIR=${SUBDIR:0:${#SUBDIR}-1};
if [ -n "${SUBDIR}" ]; then
echo -n $SUBDIR/;
fi
echo $4
##### DATEI NUR IN $VERZ_NEU -> NACH $VERZ_DIFFS KOPIEREN #####
elif [ ${3:0:${#VERZ_NEU}}==$VERZ_NEU ]; then
SUBDIR=${3:${#VERZ_ALT}+1};
SUBDIR=${SUBDIR:0:${#SUBDIR}-1};
if [ -n "${SUBDIR}" ]; then
SUBDIR=${SUBDIR}/ ;
fi;
if [ ! -d ${VERZ_DIFFS}/${SUBDIR} ]; then
# bei Bedarf Verzeichnis anlegen
$MKDIR ${VERZ_DIFFS}/${SUBDIR} ;
fi;
$CP -R $VERZ_NEU/${SUBDIR}${4} $VERZ_DIFFS/${SUBDIR}${4} ;
# Only in ... kann auch Verzeichnisse liefern, deshalb -R
##### sonstiges (sollte nicht vorkommen)
else
echo "Unbekannte Diff-Ausgabe :-( (if-Block)" >&2;
echo $1 $2 $3 $4 $5
exit 1;
fi
;;
##### sonstiges (sollte nicht vorkommen)
*)
echo "Unbekannte Diff-Ausgabe :-( (case-Block)" >&2;
echo $1 $2 $3 $4 $5
exit 1
;;
esac;
done;
exit 0;
-----------------------------------------------------------
Ach ja: Ich habe die Überprüfung der Dateinamen bewusst vermieden.
Falls jemand z. B. Dateinamen mit Leerzeichen verwendet, wird er wohl eine
Fehlermeldung ernten - aber das zu Recht, was haben schließlich Leerzeichen
im Dateinamen zu suchen?
Wer es absichern möchte: "set -- $Zeile" entsprechend anpassen bwz.
austauschen, eine recht gute Lösung hat ja David schon in diesem Tread
gepostet. Für meine Zwecke ist das allerdings nicht nötig, ich verwende
ordentliche Dateinamen ;-)
Gruß
Christian Boltz
--
Registrierter Linux-Nutzer #239431
Linux is like a wigwam:
no gates, no windows, but an apache inside.