Ich versuche, von einem Server auf einen anderen zu synchronisieren. Die Server haben dieselbe Verzeichnisstruktur, aber ich habe Probleme, den Remoteserver dazu zu bringen, den Pfadnamen auf der Fernbedienung richtig zu erkennen, wenn sich ein Leerzeichen darin befindet.
Hier sind die Details
Das lokale Verzeichnis ist
mnt/xlses/split/v2/name with space
Das entfernte Verzeichnis ist
mnt/xlses/split/v2/name with space
Ich habe alles versucht, was ich finden kann, der letzte Versuch war
rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/"name with space"
Wenn dies ausgeführt wird, wird zuerst gemeldet, dass ein neues Verzeichnis erstellt wird
Ich unterbreche es und sehe, dass es ein neues Verzeichnis gibt
mnt/xlses/split/v2/name
Alle meine Dateien befinden sich in diesem Verzeichnis
Ich hatte erwartet, dass sie da sein würden
mnt/xlses/split/v2/name with space
Versuchen
Von
man rsync
:quelle
man rsync
und nach (/s
) suchen. So installieren Sie mit Homebrew:brew install homebrew/dupes/rsync
Wenn nicht gefunden, führen Sie ausbrew search rsync
.rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
Dies funktioniert in Bash: Entfliehen Sie den Leerzeichen mit Backslash und verwenden Sie dann Anführungszeichen:
Oder wenn Sie den Pfad in der Variablen $ remote_path haben, können Leerzeichen durch Ersetzen maskiert werden:
quelle
-s
Option funktioniert auf jeder modernen Version von Rsync und wurde entwickelt, um dieses Problem zu lösenVerwenden Sie zwei Paare von Anführungszeichen
Kümmern Sie sich nicht um alle Backslashes, sondern verwenden Sie einfache Anführungszeichen in doppelten Anführungszeichen :
Sie können auch das Umgekehrte verwenden, dh doppelte Anführungszeichen in einfachen Anführungszeichen :
Weitere Infos
Wildcards auf der Serverseite
Wenn Sie möchten
*
, dass ein Wert nicht auf dem Client, sondern auf dem Server interpretiert wird,*
muss nur eines der beiden Anführungszeichen enthalten sein. Ich finde das kontraintuitiv, weil logischerweise das äußere Anführungszeichenpaar der Clientinterpretation entgeht, während das innere Anführungszeichenpaar der Serverinterpretation entgeht.Beschütze Args
Der Vorteil gegenüber der
--protect-args
Lösung ist, dass Sie tatsächlich nicht über die Einschränkungen von verfügen--protect-args
und daher Sonderzeichen wie~
oder verwenden können$
. So können Sie schreiben:oder
Beachten Sie, dass die Tilde (
~
) im letzteren Beispiel außerhalb der doppelten Anführungszeichen stehen muss.Sie können eines der Anführungszeichenpaare um den gesamten username @ host: -Dateiteil setzen (z. B.
ssh "[email protected]:'/home/me/test file'" .
).quelle
Ich verstehe, dass dies eine alte Frage ist, aber ich dachte, ich würde den vorhandenen Wissensbestand ergänzen.
Ich habe
rsync
mit mehreren Ordnern mit Platz gearbeitet und das funktioniert. Ich habe Ordner von 1-10 wie folgt nummeriert:The\ Folder1
The\ Folder2
The\ Folder3
The\ Folder10
Die 2 Instanzen, die Sie verwenden möchten,
rsync
sind lokal und remote.Lokal - Beachten Sie das Fehlen von Anführungszeichen.
Remote - Beachten Sie das Vorhandensein von Anführungszeichen
quelle
Zitieren Sie im Allgemeinen das Argument und lassen Sie die Leerzeichen im Argument frei. Versuchen Sie in dem von Ihnen angegebenen Beispiel Folgendes:
quelle
Aus den
rsync
Manpages:quelle
Nun, ich werde diese Frage selbst beantworten, obwohl jemand anderes sie besser erklären könnte.
Offensichtlich beeinflusst das Setup auf dem Zielcomputer, wie Argumente analysiert werden, und wir müssen ein Setup haben, das es schwierig macht, Anführungszeichen oder Schrägstriche zu verwenden, um Leerzeichen zu vermeiden, aber wir können Platzhalter verwenden, also habe ich dies getan
Dies funktioniert bei mir, da es nur ein Verzeichnis gibt, das mit name beginnt. Wenn ich mehrere Verzeichnisse hätte, würde dies nicht funktionieren.
Letztendlich muss ich verstehen, wie man den Remote-Server so einrichtet, dass er den Pfadnamen effizienter parst. Ich benutze keine Leerzeichen in Verzeichnisnamen, aber die Person, die dies eingerichtet hat, hat es getan, und zumindest stecke ich jetzt fest
quelle
Je nach Situation besteht eine schnelle Möglichkeit darin, einen Symlink auf dem Remote-System zu erstellen:
Verwenden Sie dann das
-L
Flag, mitrsync
dem angegeben wird, dass dem Verzeichnisinhalt gefolgt werden soll:quelle
Double Escape funktioniert auch
quelle
Versuchen Sie diesen Weg:
quelle