Hallo,
ich habe folgendes Skript (Beispiel) [ihr könnt es bei euch ohne Probleme ausführen, damit ihr das Problem besser versteht]:
1 2 3 4 5 6 7 8 9 10 11 | [ "$#" == "0" ] && exit 1 mkdir -p /tmp/rsync/quelle1 "/tmp/rsync/quelle2 leerzeichen" /tmp/rsync/ziel for i in "$@"; do test -d "$i" && ZIEL="$i"; done # letzter Pfad als Zielverzeichnis QUELLE="$(echo ${@%%$ZIEL})" # $ZIEL herausfiltern echo "Quelle(n): $QUELLE" echo "Ziel: $ZIEL" echo "- - - - - - - - - -" rsync $QUELLE "$ZIEL" -savPbh --delete --numeric-ids |
Ziel soll dabei folgendes sein: man übergibt mehrere Verzeichnisse an das Skript, welche mit rsync synchronisiert werden. Das letzte Verzeichnis ist das das Zielverzeichnis. Wundert euch nicht über die (in diesem Fall) umständliche Konstruktion mit der Schleife, denn in meinem „eigentlichen“ Skript ist es notwendig.
Folgender Aufruf erzeugt einen Fehler:
test.sh /tmp/rsync/quelle1 "/tmp/rsync/quelle2 leerzeichen" /tmp/rsync/ziel
Quelle(n): /tmp/rsync/quelle1 /tmp/rsync/quelle2 leerzeichen Ziel: /tmp/rsync/ziel - - - - - - - - - - sending incremental file list rsync: link_stat "/tmp/rsync/quelle2" failed: No such file or directory (2) rsync: link_stat "/home/janek/leerzeichen" failed: No such file or directory (2)
Die Ursache des Fehlers ist das Leerzeichen im zweiten „Quellverzeichnis“. Wenn man lediglich 1 Quelle hätte, könnte man das Problem schnell lösen, indem man $QUELLE
in Zeile 11 mit Anführungszeichen umschließt. Da aber in diesem Fall mehrere Quellverzeichnisse angegeben werden, ist das nicht möglich (rsync würde mehrere Verzeichnisse als ein einziges ansehen).
Nun habe ich schon alles mögliche Ausprobiert: Escapen der Anführungszeichen und / oder des Leerzeichens oder z.B. $(echo $QUELLE)
. Ich vermute, dass rsync die escapten Anführungszeichen als Teil des Dateinamens interpretiert, was dann unweigerlich zu Fehlern führt.
Habt ihr eine Idee, wie man das Problem lösen kann? Ich zumindest, bin mit meinem Latein am Ende…
Vielen Dank!
Gruß JaiBee