Zum xten mal: Leerzeichen im Shellskript. Diesmal: rsync
Hallo Liste ich möchte mit rsync ein Backup Skript bauen, das inkrementell (via link-dest in rsync) Backups von mehreren Rechnern erstellen kann. Die User sollen in einer Datei eine Liste mit Verzeichnissen ablegen. Diese lese ich mit dem Skript und erstelle dann mit rsync eine Kopie dieses Verzeichnisses auf den Backupserver. Der Backupteil des Skripts sieht in etwa so aus: ... while read $VERZEICHNIS do [sicherstellung, dass $VERZEICHNIS auf "/" endet] rsync -Hav --link-dest=$GESTERN/$VERZEICHNIS \ $BENUTZER@$SERVER:$VERZEICHNIS $BACKUP/$VERZEICHNIS done < $DATEI ... Wenn jetzt $DATEI so aussieht: ------- /etc /home /var/irgend etwas ------- dann geht das für "/var/irgend etwas" schief. man rsync sagt, man solle blanks mit einem "\" entwerten, das führt aber auch nicht zu dem gewünschten Erfolg. Dann wird in meinen Tests zwar das Verzeichnis kopiert, nicht aber der Inhalt. Ein "sed 's/ /\ /g'" auf $VERZEICHNIS bringt ebenfalls keinen Erfolg, genauso wenig wie "sed 's/ /\\ /g'". Im ersten Fall wird der Slash von der Bash wieder interpretiert und ist beim umsetzen von $VERZEICHNIS in dem rsync Befehl wieder weg, im zweiten Fall wird der Blackslash dann tatsächlich Teil des Verzeichnisnamens. Das will ich auch nicht. Den entwertenden Slash direkt in $DATEI zu schreiben, hab ich auch versucht, bringt aber ebenfalls keinen Erfolg. Hat irgend jemand eine Idee, was man da noch machen kann? Danke schonmal Dominik *Haare rauf* -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
cat $DATEI | while read LINE do rsync [...] "$LINE" [...] done -----Original Message----- From: Dominik Klein [mailto:dk@in-telegence.net] Sent: Friday, December 01, 2006 9:31 AM To: opensuse-de@opensuse.org Subject: Zum xten mal: Leerzeichen im Shellskript. Diesmal: rsync Hallo Liste ich möchte mit rsync ein Backup Skript bauen, das inkrementell (via link-dest in rsync) Backups von mehreren Rechnern erstellen kann. Die User sollen in einer Datei eine Liste mit Verzeichnissen ablegen. Diese lese ich mit dem Skript und erstelle dann mit rsync eine Kopie dieses Verzeichnisses auf den Backupserver. Der Backupteil des Skripts sieht in etwa so aus: ... while read $VERZEICHNIS do [sicherstellung, dass $VERZEICHNIS auf "/" endet] rsync -Hav --link-dest=$GESTERN/$VERZEICHNIS \ $BENUTZER@$SERVER:$VERZEICHNIS $BACKUP/$VERZEICHNIS done < $DATEI ... Wenn jetzt $DATEI so aussieht: ------- /etc /home /var/irgend etwas ------- dann geht das für "/var/irgend etwas" schief. man rsync sagt, man solle blanks mit einem "\" entwerten, das führt aber auch nicht zu dem gewünschten Erfolg. Dann wird in meinen Tests zwar das Verzeichnis kopiert, nicht aber der Inhalt. Ein "sed 's/ /\ /g'" auf $VERZEICHNIS bringt ebenfalls keinen Erfolg, genauso wenig wie "sed 's/ /\\ /g'". Im ersten Fall wird der Slash von der Bash wieder interpretiert und ist beim umsetzen von $VERZEICHNIS in dem rsync Befehl wieder weg, im zweiten Fall wird der Blackslash dann tatsächlich Teil des Verzeichnisnamens. Das will ich auch nicht. Den entwertenden Slash direkt in $DATEI zu schreiben, hab ich auch versucht, bringt aber ebenfalls keinen Erfolg. Hat irgend jemand eine Idee, was man da noch machen kann? Danke schonmal Dominik *Haare rauf* -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Dirk Laurenz, Dirk schrieb:
cat $DATEI | while read LINE do rsync [...] "$LINE" [...] done
bringt leider auch keinen Erfolg. Gruß Dominik -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Freitag 01 Dezember 2006 09:31 schrieb Dominik Klein: ...
while read $VERZEICHNIS do [sicherstellung, dass $VERZEICHNIS auf "/" endet] rsync -Hav --link-dest=$GESTERN/$VERZEICHNIS \ $BENUTZER@$SERVER:$VERZEICHNIS $BACKUP/$VERZEICHNIS done < $DATEI ...
Wenn jetzt $DATEI so aussieht: ------- /etc /home /var/irgend etwas -------
dann geht das für "/var/irgend etwas" schief.
Hast du schon mal die Option --files-from=FILE read list of source-file names from FILE von rsync probiert? -- Viele Grüße ------------------------------------------------------------------------ Michael -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hast du schon mal die Option --files-from=FILE read list of source-file names from FILE von rsync probiert?
Okay, das scheint prinzipiell zu funktionieren. Wirft aber einiges meines bisherigen Konzeptes über den Haufen. Dazu muss ich dann das Konfigfile vorher parsen, damit jede Zeile mit einem / endet, denn es soll ja das komplette Verzeichnis gesichert werden. Ist ne Möglichkeit. Danke für den Tipp. Wenn's nicht anders geht, werde ich das wohl verwenden. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dominik Klein wrote:
Hast du schon mal die Option --files-from=FILE read list of source-file names from FILE von rsync probiert?
Okay, das scheint prinzipiell zu funktionieren. Wirft aber einiges meines bisherigen Konzeptes über den Haufen.
Dazu muss ich dann das Konfigfile vorher parsen, damit jede Zeile mit einem / endet, denn es soll ja das komplette Verzeichnis gesichert werden.
Ist ne Möglichkeit.
Danke für den Tipp. Wenn's nicht anders geht, werde ich das wohl verwenden.
OLDIFS=$IFS IFS=$'\n' ... do your stuff IFS=$OLDIFS Wenn du das Leerzeichen nicht als Argumenttrenner brauchst im weiteren Script, kannst du auch nur am Anfang IFS=$'\n' setzen und bist das Problem los. Sandy -- Antworten bitte nur in die Mailingliste! PMs bitte an: news-reply2 (@) japantest (.) homelinux (.) com -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Freitag 01 Dezember 2006 10:19 schrieb Dominik Klein:
Dazu muss ich dann das Konfigfile vorher parsen, damit jede Zeile mit einem / endet, denn es soll ja das komplette Verzeichnis gesichert werden.
Häng' doch einfach immer ein '/' dran, wenn dann zwei da sind, stört das nicht. -- Viele Grüße ------------------------------------------------------------------------ Michael -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Häng' doch einfach immer ein '/' dran, wenn dann zwei da sind, stört das nicht.
Pf. Wie sieht das denn im Log aus *g* Nee nee sowas kommt mir nich inne Tüte. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Freitag, 1. Dezember 2006 09:31 schrieb Dominik Klein:
Hallo Liste
ich möchte mit rsync ein Backup Skript bauen, das inkrementell (via link-dest in rsync) Backups von mehreren Rechnern erstellen kann.
ich würde rsnapshot benutzen http://www.rsnapshot.org/ Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dominik Klein wrote:
Der Backupteil des Skripts sieht in etwa so aus:
... OldIFS="$IFS" IFS=' ' while read $VERZEICHNIS do [sicherstellung, dass $VERZEICHNIS auf "/" endet] rsync -Hav --link-dest=$GESTERN/$VERZEICHNIS \ $BENUTZER@$SERVER:$VERZEICHNIS $BACKUP/$VERZEICHNIS done < $DATEI ...
Wenn jetzt $DATEI so aussieht: ------- /etc /home /var/irgend etwas -------
wenn Du fertig bist, dann schließlich noch (optional) IFS="$OldIFS" Zur Erklärung: IFS ist der InternalFieldSeparator, das ist eine Liste von Zeichen, die standardmäßig aus den Zeichen 'Leerzeichen', 'Tabulator' und 'newline' (Zeilenende) besteht. Da das Leerzeichen jetzt sowohl als Feld-Separator als auch innerhalb eines Strings vorkommen kann, geht das ganze schief. Setzt man IFS nur auf 'newline' (siehe oben, hinter dem ' von IFS=' darf nur eine Zeilenschaltung kommen und das nächste ' muss unbedingt am Zeilenanfang stehen) dann funktionierts so wie Du es willst und es können sowohl Leerzeichen als auch Tabulatoren in Filenamen vorkommen. Außer natürlich, jemand kommt auf die kranke Idee, Newlines in Filenamen zu integrieren. Gruß, Christian -- Name: Christian Andretzky | Address: TU Chemnitz | Phone: ++49 +371 531 32130 | Fak. Maschinenbau/Verfahrenstechnik | FAX: ++49 +371 531 832130 | Reichenhainer Str. 70 | mail: Christian.Andretzky@MB.TU-Chemnitz.DE | D-09107 Chemnitz | PGP: public key avaliable via public key server | In a world without walls and fences, there is no need for windows and gates | "The Box said 'Windows 95 or better'. - So I installed Linux." | -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
OldIFS="$IFS" IFS=' ... wenn Du fertig bist, dann schließlich noch (optional) IFS="$OldIFS"
auch @Sandy Auf die Idee war ich auch bereits gekommen. Da das Verzeichnis aber auf dem remote Host liegt, müsste IFS dort gesetzt werden. Da rsync mit ssh aber keine wirkliche Shell startet, kann ich es dort nicht setzen. (so sieht es jedenfalls für mich aus). Lokal funktioniert die IFS Lösung. Habe ich ebenfalls mehrfach im Einsatz. Solltet ihr das hingegen erfolgreich getestet haben, wäre ich für die genauen Kommandos eures Tests dankbar. Gruß Dominik -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Fre, 01 Dez 2006, Dominik Klein schrieb:
Der Backupteil des Skripts sieht in etwa so aus: ... while read $VERZEICHNIS do [sicherstellung, dass $VERZEICHNIS auf "/" endet] rsync -Hav --link-dest=$GESTERN/$VERZEICHNIS \ $BENUTZER@$SERVER:$VERZEICHNIS $BACKUP/$VERZEICHNIS done < $DATEI [..] dann geht das für "/var/irgend etwas" schief. [..] *Haare rauf*
*Haare rauf* Zum x-hundertsten Mal: QUOTEN! QUOTEN! QUOTEN! while read VERZEICHNIS; do VERZEICHNIS="$(echo "$VERZEICHNIS" | sed 's@/*$@/@')" rsync -Hav \ --link-dest="${GESTERN}/${VERZEICHNIS}" \ "${BENUTZER}@${SERVER}:${VERZEICHNIS}" \ "${BACKUP}/${VERZEICHNIS}" done < "$DATEI" Sollte alles außer Zeilenumbrüchen fressen. *grmpfl* -dnh -- Indifference will be the downfall of mankind, but who cares? -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (7)
-
Christian Andretzky
-
David Haller
-
Dominik Klein
-
Dr. Jürgen Vollmer
-
Laurenz, Dirk
-
Michael Behrens
-
Sandy Drobic