Hier ist die Musterlösung zu Aufgabe: Abgleichen von Verzeichnissen: updt:
#!/bin/sh # ##################################################################### # # Time-stamp: "29.09.02 15:38 updt klaus@wachtler.de" # # Shellskript, um zwei (oder mehr) Dateien und Verzeichnisse # abzugleichen. # ##################################################################### # # ///| |||\ || |||| // # ////| |||\\ || |||| // # ////|| ||||\\ || |||| // # //// || |||| \\ || |||| // # ////==|| |||| \\|| ||||// # //// || |||| \\| |||// # //// || |||| \| ||// # |// # |||| /| // // ///| ||||=====// ////======= # |||| /|| // // ////| |||| // //// # |||| //|| // // ////|| |||| // //// # |||| // || // // //// || |||| // //// # ||||// ||// // ////==|| ||||=(( ((((======= # |||// |// // //// || |||| \\ \\\\ # |||/ |/ // //// || |||| \\ \\\\======= # ##################################################################### # # Copyright: ############ # # (C) 1999-2002 AnyWare # # Dipl.Ing. Klaus Wachtler # Breidingstr. 17 # 29614 Soltau # # Tel. (+49)-5191-70 2 71, (+49)-171-45 53 039 # Fax: (+49)-5191-70 2 72 # eMail AnyWare@Wachtler.de # ##################################################################### # # Aufgabenstellung: ################### # # Dieses Skript wird mit mindestens zwei Verzeichnisnamen aufgerufen. # Alle angegebenen Verzeichnisse werden miteinander abgeglichen, sind # danach also identisch. # # Funktionsweise: # Es wird mit cp -u ... von jedem Verzeichnis in alle anderen # kopiert. # Beispiel: # updt /home/klaus /home/klaus.archiv # kopiert alle neueren oder fehlenden Dateien von /home/klaus nach # /home/klaus.archiv, und dann die neueren oder fehlenden von # /home/klaus.archiv nach /home/klaus. # Oder: # updt a b c d # kopiert entsprechend von a nach b, c, und d; dann von b nach # a, c, d; dann von c nach a, b, d, und zuletzt von d nach a, b, # und c. # # Optionen: ########### # # -v oder --verbose: # ausführlichere Ausgabe erzeugen. # # -h, -? oder --help: # es wird eine kurze Hilfe ausgegeben. # # -1 (eine Eins): # es wird nur in eine Richtung kopiert. # Beispiel: # updatedir -1 a b c d # kopiert von a nach b, c, und d; dann von b nach c und d, dann # von c nach d. # ##################################################################### # # Geschichte: ############# # # Datum: Name: Vers. Aenderung: # 14. 5.1999 kw 0.0 erster Entwurf # 17.01.2002 kw - fehlende Verzeichnisse werden ggf. neu # angelegt # - existierende Dateien werden gelöscht, # bevor ein Verzeichnis mit dem selben # Namen angelegt wird # - existierende Verzeichnisse werden # gelöscht, bevor Dateien desselben Namens # kopiert werden # ##################################################################### # # Benoetigt: ############ # # ##################################################################### # # Umgebung: ########### # # ##################################################################### unset VERBOSE UNIDIRECT VERZEICHNISSE VERZEICHNISSER #VERZEICHNISSE="" #VERZEICHNISSER="" #UNIDIRECT="" #VERBOSE="" usage() { cat <<EOF $0 wird mit mindestens zwei Verzeichnisnamen aufgerufen. Alle angegebenen Dateien und Verzeichnisse werden miteinander abgeglichen, sind danach also identisch. Funktionsweise: Es wird mit cp -u ... von jedem Verzeichnis in alle anderen kopiert. Beispiel: updt /home/klaus /home/klaus.archiv kopiert alle neueren oder fehlenden Dateien von /home/klaus nach /home/klaus.archiv, und dann die neueren oder fehlenden von /home/klaus.archiv nach /home/klaus. Oder: updt a b c d kopiert entsprechend von a nach b, c, und d; dann von b nach a, c, d; dann von c nach a, b, d, und zuletzt von d nach a, b, und c. Optionen: ########## -v oder --verbose: ausführlichere Ausgabe erzeugen. -h, -? oder --help: es wird eine kurze Hilfe ausgegeben. -1 (eine Eins): es wird nur in eine Richtung kopiert. Beispiel: updatedir -1 a b c d kopiert von a nach b, c, und d; dann von b nach c und d, dann von c nach d. EOF }
# Schleife über alle Parameter, dabei jeweils eine Liste für den # Vorwärtsdurchlauf und eine für den Rückwärtsdurchlauf # zusammenbauen: for arg do case $arg in -h|-"?"|--help) usage true exit ;; -v|-verbose) VERBOSE="y" ;; -1) UNIDIRECT="y" ;; *) VERZEICHNISSE=$VERZEICHNISSE" "$arg VERZEICHNISSER=$arg" "$VERZEICHNISSER # if [ -r $arg ] # then # VERZEICHNISSE=$VERZEICHNISSE" "$arg # VERZEICHNISSER=$arg" "$VERZEICHNISSER # else # # echo $arg" ist kein Verzeichnis!" # echo $arg" ist nicht lesbar!" # false # exit # fi ;; esac done if [ $VERBOSE ] then #echo "VERBOSE ="$VERBOSE #echo "UNIDIRECT ="$UNIDIRECT #echo "abzugleichen: " $VERZEICHNISSE VERBOSE="-v" fi LETZTES="" VERZEICHNISGEDREHT="" # Vorwärtsdurchlauf durch alle Verzeichnisse/Dateien: for d in $VERZEICHNISSE do VERZEICHNISGEDREHT=$d" "$VERZEICHNISGEDREHT if [ $LETZTES ] then # if [ "$VERBOSE" ] # then # echo $LETZTES" -> "$d # fi if [ ! -e $LETZTES ] then echo $LETZTES existiert nicht! false exit fi # Wenn die Quelle ein Verzeichnis ist, dann muß # 1) geprüft werden, ob das Ziel auch ein Verzeichnis ist. # Wenn nicht, dann ggf. eine Datei mit dem Namen # löschen, und ein leeres Verzeichnis anlegen. # 2) es muß kopiert werden in der Art: # cp -... source/* dest # # Ist die Quelle kein Verzeichnis, dann muß # 1) das Ziel gelöscht werden, falls es ein Verzeichis ist # 2) es muß kopiert werden in der Art: # cp -... source dest if [ -d $LETZTES ] then #echo Quelle $LETZTES ist ein Verzeichnis! if [ ! -d $d ] then #echo Ziel $d ist kein Verzeichnis! # Ggf. löschen: rm -rf $d # neu anlegen: mkdir -p $d # Zugriffsrechte kopieren: chmod --reference=$LETZTES $d chown --reference=$LETZTES $d fi #echo cp $VERBOSE -u -d -f -r -p $LETZTES/* $d cp $VERBOSE -u -d -f -r -p $LETZTES/* $d touch --reference=$LETZTES $d else #echo Quelle $LETZTES ist kein Verzeichnis! if [ -d $d ] then #echo Ziel $d ist ein Verzeichnis! # Ggf. löschen: rm -rf $d fi #echo cp $VERBOSE -u -d -f -p $LETZTES $d cp $VERBOSE -u -d -f -p $LETZTES $d fi fi LETZTES=$d done if [ ! "$UNIDIRECT" = "y" ] then LETZTES="" for d in $VERZEICHNISGEDREHT do if [ $LETZTES ] then # if [ "$VERBOSE" ] # then # echo $LETZTES" -> "$d # fi # Wenn die Quelle ein Verzeichnis ist, dann muß # 1) geprüft werden, ob das Ziel auch ein Verzeichnis # ist. # Wenn nicht, dann ggf. eine Datei mit dem Namen # löschen, und ein leeres Verzeichnis anlegen. # 2) es muß kopiert werden in der Art: # cp -... source/* dest # # Ist die Quelle kein Verzeichnis, dann muß # 1) das Ziel gelöscht werden, falls es ein Verzeichis # ist # 2) es muß kopiert werden in der Art: # cp -... source dest if [ -d $LETZTES ] then #echo Quelle $LETZTES ist ein Verzeichnis! if [ ! -d $d ] then #echo Ziel $d ist kein Verzeichnis! # Ggf. löschen: rm -rf $d # neu anlegen: mkdir -p $d # Zugriffsrechte kopieren: chmod --reference=$LETZTES $d chown --reference=$LETZTES $d fi #echo cp $VERBOSE -u -d -f -r -p $LETZTES/* $d cp $VERBOSE -u -d -f -r -p $LETZTES/* $d touch --reference=$LETZTES $d else #echo Quelle $LETZTES ist kein Verzeichnis! if [ -d $d ] then #echo Ziel $d ist ein Verzeichnis! # Ggf. löschen: rm -rf $d fi #echo cp $VERBOSE -u -d -f -p $LETZTES $d cp $VERBOSE -u -d -f -p $LETZTES $d
fi fi LETZTES=$d done fi