qeldroma
08-02-2004, 22:28
Ich habe ein Skript, welches einen Kopiervorgang auslösen soll, der aber bestimmte Unterverzeichnisse NICHT beinhaltet, daher kann ich nicht rekursiv kopieren.
Folgend das Skript:
#!/bin/bash
########################################
# Be sure, that the ROOT_PATH exists!! #
# Be sure that the combination of #
# BACKUP_PATH and ROOT_PATH exists!! #
########################################
1 # Define the source
2 ROOT_PATH="/shared/test"
3
4 # Define the backup-dir here
5 BACKUP_PATH="/mnt/backup"
6
7 # Define the storage-partititon here
8 BACKUP_PART="/dev/hdb1"
9
10 # Mount the partititon if not already mounted
11 grep -q $BACKUP_PART /etc/mtab || mount $BACKUP_PART $BACKUP_PATH
12
13 # Define dirs that do NOT need a backup.
14 # BE SURE to backslash whitespaces in names!!
15 # Ex.: "/Test dir" -> "/Test\\ dir"
16 EXC_DIRS="/install"
17
18 ALL_DIRS=`ls -RQ $ROOT_PATH|grep :|tr -d :`
19
20 ALL_DIRS2=${ALL_DIRS// /_}
21
22 for DIR in `echo $ALL_DIRS2`
23 do
24 DUMMY=`echo $DIR|tr -d '"'`
25 DUMMY2=${DUMMY//_/\\\\\\ }
26 DOIT=`echo $DUMMY2|fgrep $EXC_DIRS`
27 if [ "$DOIT" == "" ]; then
28 [ -e "$BACKUP_PATH${DUMMY//_/ }" ] || mkdir "$BACKUP_PATH${DUMMY//_/ }"
29 cp -dpPu "$DUMMY2" "$BACKUP_PATH$DUMMY2"
30 fi
31 done
Zwei Probleme habe ich laufend:
1. KOMPLIZIERT. Ich habe ja bei manchen Pfaden auch Leerzeichen drin, daher habe ich diese durch Underscores ersetzt, um sie dann in der For-Schleife wieder zurückzuwandeln. Ansonsten zerhackt mir die For-Schleife den String an den falschen Stellen.
AUßerdem habe ich festgestellt, das "cp" ebenfalls die Backslashes vor den Leerzeichen im Namen braucht, damit es funktioniert. Daher packe ich die ebenfalls noch rein.
Schlußendlich würde ja auch ein Leerzeichen zwischen zwei Pfaden zu einem Underscore gemacht, was ja falsch wäre, deswegen sind die Inhalte in Doppelquots (ls -Q), welche ich dann in der For-Schleife wieder rauspflücke...
In anderen Worten:
Wie komme ich eleganter zu einer For-Schleife, welche dann nur noch aufgrund DOIT entscheiden muß, ob der aktuelle Pfad kopiert wird, oder nicht?!
2. Es klappt das Kopieren nicht gescheit, es gibt einen Fehler.
z.B. ergibt das Script für "/shared/test/dies ist schwer" folgenden cp-Befehl:
cp -dpPu "/shared/test/dies\\ ist\\ schwer" "/mnt/backup/shared/test/dies\\ ist\\ schwer"
Der darauf folgende Fehler:
cp: Aufruf von stat für »/shared/test/dies\\ ist\\ schwer« nicht möglich: No such file or directory
Lasse ich die doppelten Anführungszeichen weg, also statt
cp -dpPu "$DUMMY2" "$BACKUP_PATH$DUMMY2"
nehme ich
cp -dpPu $DUMMY2 $BACKUP_PATH$DUMMY2
gibt es den Fehler:
cp: Verzeichnis »/shared/test/dies ist schwer« ausgelassen
Leider jedoch ohne Begründung?!
Gemacht hat er dann auch gar nischds...
Letztendlich soll einfach inklusive aller Attribute eine Spiegelkopie von ROOT_PATH unter BACKUP_PATH/ROOT_PATH erfolgen, wobei EXC_DIRS, können auch mehrere sein, ausgelassen werden sollen...
Kann mir jmd. dabei weiterhelfen?
--------------------------------------------------------------
Achja, BITTE keine "MACH'S DOCH GANZ ANDERS"-Antworten!!
Ich will wissen, wie ich das jetzt so löse, wie ich angefangen habe, denn sonst stehe ich bei anderer Gelegenheit wieder vor dem gleichen Problem.
Folgend das Skript:
#!/bin/bash
########################################
# Be sure, that the ROOT_PATH exists!! #
# Be sure that the combination of #
# BACKUP_PATH and ROOT_PATH exists!! #
########################################
1 # Define the source
2 ROOT_PATH="/shared/test"
3
4 # Define the backup-dir here
5 BACKUP_PATH="/mnt/backup"
6
7 # Define the storage-partititon here
8 BACKUP_PART="/dev/hdb1"
9
10 # Mount the partititon if not already mounted
11 grep -q $BACKUP_PART /etc/mtab || mount $BACKUP_PART $BACKUP_PATH
12
13 # Define dirs that do NOT need a backup.
14 # BE SURE to backslash whitespaces in names!!
15 # Ex.: "/Test dir" -> "/Test\\ dir"
16 EXC_DIRS="/install"
17
18 ALL_DIRS=`ls -RQ $ROOT_PATH|grep :|tr -d :`
19
20 ALL_DIRS2=${ALL_DIRS// /_}
21
22 for DIR in `echo $ALL_DIRS2`
23 do
24 DUMMY=`echo $DIR|tr -d '"'`
25 DUMMY2=${DUMMY//_/\\\\\\ }
26 DOIT=`echo $DUMMY2|fgrep $EXC_DIRS`
27 if [ "$DOIT" == "" ]; then
28 [ -e "$BACKUP_PATH${DUMMY//_/ }" ] || mkdir "$BACKUP_PATH${DUMMY//_/ }"
29 cp -dpPu "$DUMMY2" "$BACKUP_PATH$DUMMY2"
30 fi
31 done
Zwei Probleme habe ich laufend:
1. KOMPLIZIERT. Ich habe ja bei manchen Pfaden auch Leerzeichen drin, daher habe ich diese durch Underscores ersetzt, um sie dann in der For-Schleife wieder zurückzuwandeln. Ansonsten zerhackt mir die For-Schleife den String an den falschen Stellen.
AUßerdem habe ich festgestellt, das "cp" ebenfalls die Backslashes vor den Leerzeichen im Namen braucht, damit es funktioniert. Daher packe ich die ebenfalls noch rein.
Schlußendlich würde ja auch ein Leerzeichen zwischen zwei Pfaden zu einem Underscore gemacht, was ja falsch wäre, deswegen sind die Inhalte in Doppelquots (ls -Q), welche ich dann in der For-Schleife wieder rauspflücke...
In anderen Worten:
Wie komme ich eleganter zu einer For-Schleife, welche dann nur noch aufgrund DOIT entscheiden muß, ob der aktuelle Pfad kopiert wird, oder nicht?!
2. Es klappt das Kopieren nicht gescheit, es gibt einen Fehler.
z.B. ergibt das Script für "/shared/test/dies ist schwer" folgenden cp-Befehl:
cp -dpPu "/shared/test/dies\\ ist\\ schwer" "/mnt/backup/shared/test/dies\\ ist\\ schwer"
Der darauf folgende Fehler:
cp: Aufruf von stat für »/shared/test/dies\\ ist\\ schwer« nicht möglich: No such file or directory
Lasse ich die doppelten Anführungszeichen weg, also statt
cp -dpPu "$DUMMY2" "$BACKUP_PATH$DUMMY2"
nehme ich
cp -dpPu $DUMMY2 $BACKUP_PATH$DUMMY2
gibt es den Fehler:
cp: Verzeichnis »/shared/test/dies ist schwer« ausgelassen
Leider jedoch ohne Begründung?!
Gemacht hat er dann auch gar nischds...
Letztendlich soll einfach inklusive aller Attribute eine Spiegelkopie von ROOT_PATH unter BACKUP_PATH/ROOT_PATH erfolgen, wobei EXC_DIRS, können auch mehrere sein, ausgelassen werden sollen...
Kann mir jmd. dabei weiterhelfen?
--------------------------------------------------------------
Achja, BITTE keine "MACH'S DOCH GANZ ANDERS"-Antworten!!
Ich will wissen, wie ich das jetzt so löse, wie ich angefangen habe, denn sonst stehe ich bei anderer Gelegenheit wieder vor dem gleichen Problem.