bema
02-06-2007, 23:10
Hallo,
ich habe mir ein kleines Backup Skript geschrieben mit dem ich zwei Verzeichnisse rekursiv auf Inhalt überprüfe. Existiert in dem Zielverzeichnis eine Datei nicht, welche aber im Quellverzeichnis existiert, wird sie im Zielverzeichnis angelegt. Das selbe gilt für Unterverzeichnisse und deren Inhalt.
Nun zu dem Problem: Nachdem ein Unterverzeichnis gefunden wurde, wird es ggf. angelegt. Danach wird in das Verzeichnis gewechselt und alle darin befindlichen Dateien abgearbeitet. Danach wird die Funktion welche das Unterverzeichnis bearbeitet hat verlassen und die aufrufende Funktion arbeitet das aktuelle Verzeichnis weiter ab.
Nur irgendwie steht dann plötzlich in der Variable welche sich das aktuelle Verzeichnis merkt, dass Verzeichnis vom letzten rekursiven Aufruf. Und das obwohl ich den Wert der Variable nicht ändere.
Soll heißen: Sobald ein Unterverzeichnis abgearbeitet wurde, können alle (alphabetisch) nach dem Unterverzeichnis folgenden Dateien nicht mehr abgearbeitet werden, da das Skript meint, diese würden im bereits abgearbeiteten Unterverzeichnis liegen.
Ich kann den Fehler einfach nicht finden und würde mich freuen wenn ihr da mal drüber schaut. Das Skript ist so ziemlich mein erstes Shell-Script und vielleicht habe ich ja einen kleinen aber entscheidenden Fehler gemacht.
#!/bin/sh
################################################## ########
function Check()
{
SOURCE=${1}
BACKUP=${2}
echo "Aktuelles Verzeichnis: ${SOURCE}"
# Solange ls Ergebnis liefert
for i in `ls ${SOURCE}`
do
echo "Pruefe ${SOURCE}/$i"
# Wenn es ein Verzeichnis ist
if [ -d "${SOURCE}/${i}" ]
then
# Wenn das Verzeichnis noch nicht existiert
if [ ! -d "${BACKUP}/${i}" ]
then
# Lege das Verzeichnis an
mkdir ${BACKUP}/${i}
echo "Verzeichnis ${BACKUP}/${i} wurde erstellt"
fi
# Pruefe Inhalte des Verzeichnis
Check ${SOURCE}/${i} ${BACKUP}/${i}
# Ansonsten ist es eine Datei
else
# Wenn die Datei neuer ist
if [ "${SOURCE}/${i}" -nt "${BACKUP}/${i}" ]
then
# Kopiere sie
cp ${SOURCE}/${i} ${BACKUP}/${i}
echo "${SOURCE}/${i} wurde gesichert"
fi
fi
done
echo "Verzeichnis wird verlassen: ${SOURCE}"
}
################################################## ########
SOURCE_DIR=${1}
BACKUP_DIR=${2}
################################################## ########
if [ ! ${#} -eq 2 ]
then
echo "Usage: ${0} <source_dir> <backup_dir>"
exit -1
fi
if [ ! -d ${SOURCE_DIR} ]
then
echo "Der erste Parameter muss ein Verzeichnis sein!"
exit -1
fi
if [ ! -d ${BACKUP_DIR} ]
then
echo "Der zweite Parameter muss ein Verzeichnis sein!"
exit -1
fi
################################################## #######
Check ${SOURCE_DIR} ${BACKUP_DIR}
Vielen Dank! :)
ich habe mir ein kleines Backup Skript geschrieben mit dem ich zwei Verzeichnisse rekursiv auf Inhalt überprüfe. Existiert in dem Zielverzeichnis eine Datei nicht, welche aber im Quellverzeichnis existiert, wird sie im Zielverzeichnis angelegt. Das selbe gilt für Unterverzeichnisse und deren Inhalt.
Nun zu dem Problem: Nachdem ein Unterverzeichnis gefunden wurde, wird es ggf. angelegt. Danach wird in das Verzeichnis gewechselt und alle darin befindlichen Dateien abgearbeitet. Danach wird die Funktion welche das Unterverzeichnis bearbeitet hat verlassen und die aufrufende Funktion arbeitet das aktuelle Verzeichnis weiter ab.
Nur irgendwie steht dann plötzlich in der Variable welche sich das aktuelle Verzeichnis merkt, dass Verzeichnis vom letzten rekursiven Aufruf. Und das obwohl ich den Wert der Variable nicht ändere.
Soll heißen: Sobald ein Unterverzeichnis abgearbeitet wurde, können alle (alphabetisch) nach dem Unterverzeichnis folgenden Dateien nicht mehr abgearbeitet werden, da das Skript meint, diese würden im bereits abgearbeiteten Unterverzeichnis liegen.
Ich kann den Fehler einfach nicht finden und würde mich freuen wenn ihr da mal drüber schaut. Das Skript ist so ziemlich mein erstes Shell-Script und vielleicht habe ich ja einen kleinen aber entscheidenden Fehler gemacht.
#!/bin/sh
################################################## ########
function Check()
{
SOURCE=${1}
BACKUP=${2}
echo "Aktuelles Verzeichnis: ${SOURCE}"
# Solange ls Ergebnis liefert
for i in `ls ${SOURCE}`
do
echo "Pruefe ${SOURCE}/$i"
# Wenn es ein Verzeichnis ist
if [ -d "${SOURCE}/${i}" ]
then
# Wenn das Verzeichnis noch nicht existiert
if [ ! -d "${BACKUP}/${i}" ]
then
# Lege das Verzeichnis an
mkdir ${BACKUP}/${i}
echo "Verzeichnis ${BACKUP}/${i} wurde erstellt"
fi
# Pruefe Inhalte des Verzeichnis
Check ${SOURCE}/${i} ${BACKUP}/${i}
# Ansonsten ist es eine Datei
else
# Wenn die Datei neuer ist
if [ "${SOURCE}/${i}" -nt "${BACKUP}/${i}" ]
then
# Kopiere sie
cp ${SOURCE}/${i} ${BACKUP}/${i}
echo "${SOURCE}/${i} wurde gesichert"
fi
fi
done
echo "Verzeichnis wird verlassen: ${SOURCE}"
}
################################################## ########
SOURCE_DIR=${1}
BACKUP_DIR=${2}
################################################## ########
if [ ! ${#} -eq 2 ]
then
echo "Usage: ${0} <source_dir> <backup_dir>"
exit -1
fi
if [ ! -d ${SOURCE_DIR} ]
then
echo "Der erste Parameter muss ein Verzeichnis sein!"
exit -1
fi
if [ ! -d ${BACKUP_DIR} ]
then
echo "Der zweite Parameter muss ein Verzeichnis sein!"
exit -1
fi
################################################## #######
Check ${SOURCE_DIR} ${BACKUP_DIR}
Vielen Dank! :)