PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASH: Wie kopiere ich mit Variablen sicher?



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.

DaTa
09-02-2004, 16:19
18 ALL_DIRS=`ls -RQ $ROOT_PATH|grep :|tr -d :`
19
20 ALL_DIRS2=${ALL_DIRS// /_}
21
22 for DIR in `echo $ALL_DIRS2`



useless use of backticks:


for DIR in $ALL_DIRS2


versuchs mal mit find und einer while schleife:


find "$ROOT_PATH" -type d | while IFS= read DIR
do
do_simething_with "$DIR"
done


Du brauchst nicht mit Backslashes um dich werfen. Es reicht die Variablen in "" zu setzen.



VAR="a b c d e f"
touch "$VAR"
ls -l "$VAR"
rm "$VAR"
ls -l "$VAR"