So synchronisieren Sie ssh, wenn Verzeichnisnamen Leerzeichen enthalten

71

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
PyNEwbie
quelle

Antworten:

8

Versuchen

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space [email protected]:/mnt/xlses/split/v2/

Ich habe den abschließenden Schrägstrich /aus dem Quellverzeichnispfad entfernt. Dadurch werden rsyncdas Verzeichnis und sein gesamter Inhalt kopiert, was bedeutet rsync, dass der Name auf dem Remote-Host (auf dem er ausgeführt wird) nicht auf Sie zutrifft.

dg99
quelle
9
Das hat bei mir nicht geklappt, aber die Antwort von johnLate hat geklappt.
Adriaan Tijsseling
Dies erklärt nicht, wie mit Leerzeichen auf der entfernten Seite umgegangen wird.
ckujau
Dies funktioniert nicht, wie bereits erwähnt.
Lizardx
128

Versuchen

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "[email protected]:/mnt/xlses/split/v2/name with space"

Von man rsync:

-s, --protect-args

Diese Option sendet alle Dateinamen und die meisten Optionen an die Remote-Synchronisierung, ohne dass die Remote-Shell sie interpretieren kann. Dies bedeutet, dass Leerzeichen nicht in Namen aufgeteilt werden und Sonderzeichen, die keine Platzhalterzeichen sind, nicht übersetzt werden (z. B. ~, $,;, & usw.). Platzhalter werden auf dem Remote-Host durch rsync erweitert (anstelle der Shell, die dies ausführt). [...]

johnLate
quelle
13
Dies funktioniert nicht für Mac.
Matt Alexander
8
Funktioniert auf dem Mac, wenn Sie eine aktuelle Version von rsync mit Home-Brew installieren.
Adriaan Tijsseling
4
Überprüfen Sie, ob es in Ihrer Version von rsync enthalten ist, indem Sie "--protect" ausführen man rsyncund nach ( /s) suchen. So installieren Sie mit Homebrew: brew install homebrew/dupes/rsyncWenn nicht gefunden, führen Sie aus brew search rsync.
MikeiLL
12
Neue Version installiert , ist nicht notwendig, die Sie gerade Räume entkommen und den Host / Dateinamen zitierten - zBrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo
Dies sollte die akzeptierte Antwort sein.
Josh M.
39

Dies funktioniert in Bash: Entfliehen Sie den Leerzeichen mit Backslash und verwenden Sie dann Anführungszeichen:

rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

Oder wenn Sie den Pfad in der Variablen $ remote_path haben, können Leerzeichen durch Ersetzen maskiert werden:

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
quelle
1
Das hat bei mir geklappt. Ich musste nicht mehr auf einem Mac-Server arbeiten.
George
1
Dies sollte die richtige Antwort markiert werden. Der Schlüssel ist, dass Sie sowohl Backslashes als auch Anführungszeichen benötigen.
Sridhar Sarnobat
4
Double-Escape ist ein Schmerz, die -sOption funktioniert auf jeder modernen Version von Rsync und wurde entwickelt, um dieses Problem zu lösen
Mark K Cowan
Hinweis : Wenn Sie von einem Remote-Server mit einem Leerzeichen im Pfad zu einem lokalen Pfad mit Leerzeichen kopieren, müssen Sie nur die Anführungszeichen zum Remote-Pfad hinzufügen .
Lenooh
Die Lösung von @teekarna hat für mich funktioniert. Gemäß der Manpage "rsync" können Sie alternativ "--protect-args" oder "-s" verwenden, was auch für mich funktioniert hat.
Kishan Parekh
14

Verwenden Sie zwei Paare von Anführungszeichen

Kümmern Sie sich nicht um alle Backslashes, sondern verwenden Sie einfache Anführungszeichen in doppelten Anführungszeichen :

ssh [email protected]:"'/home/me/test file'" .

Sie können auch das Umgekehrte verwenden, dh doppelte Anführungszeichen in einfachen Anführungszeichen :

ssh [email protected]:'"/home/me/test file"' .

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-argsLösung ist, dass Sie tatsächlich nicht über die Einschränkungen von verfügen --protect-argsund daher Sonderzeichen wie ~oder verwenden können$ . So können Sie schreiben:

rsync host:'"$HOME/test file"' .

oder

rsync host:'~"/test file"' .

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'" .).

Sridhar Sarnobat
quelle
Tatsächlich ist Ihr Vorschlag, den Host-Teil überhaupt nicht in Anführungszeichen zu setzen, aufschlussreicher, daher ist es verlockend, dies als erste Zeile im Beitrag zu markieren.
Sridhar Sarnobat
2
Diese Lösung ist genial! Arbeitete so, wie es auf dem Blech war, mit rsync über ssh.
Ikon
Wenn Sie darüber nachdenken, sind die beiden Anführungszeichenpaare völlig logisch: Das äußere Anführungszeichenpaar ist so, dass der Client es unteilbar behandelt (dessen Inhalt wörtlich an den Server übergeben wird) und das innere Anführungszeichenpaar für den Server die Unteilbarkeit erkennen.
Sridhar Sarnobat
Diese Antwort wird unterschätzt.
Derple
6

Ich verstehe, dass dies eine alte Frage ist, aber ich dachte, ich würde den vorhandenen Wissensbestand ergänzen.

Ich habe rsyncmit 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, rsyncsind lokal und remote.

  1. Lokal - Beachten Sie das Fehlen von Anführungszeichen.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remote - Beachten Sie das Vorhandensein von Anführungszeichen

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    
Gokul Wimalanathan
quelle
3

Zitieren Sie im Allgemeinen das Argument und lassen Sie die Leerzeichen im Argument frei. Versuchen Sie in dem von Ihnen angegebenen Beispiel Folgendes:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
James
quelle
1

Aus den rsyncManpages:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest
Shammel Lee
quelle
0

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

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/name*

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

PyNEwbie
quelle
Ihr Vorschlag funktioniert nur, weil Sie das Zielverzeichnis bereits bei Ihrem ersten (erfolglosen) Versuch erstellt haben. Siehe meine Antwort für einen einfacheren Weg (das hat auch den Vorteil, sich nicht auf einen fehlgeschlagenen ersten Versuch zu verlassen :).
dg99
Naja eigentlich existierte das Verzeichnis schon. Sie sind nicht richtig in meinem gescheiterten Versuch es das Verzeichnis erstellt / ~ / Name nicht / ~ / Name mit Platz Ich löschte / ~ / Name und hielt verschiedene Optionen Das Verzeichnis versucht , mit Platz / ~ / Name existiert bereits Ich habe versucht , Dateien hinzufügen dazu
PyNEwbie
Oh, ich verstehe, was du meinst.
dg99
Funktioniert, wenn Sie den Host / Pfad angeben und die Leerzeichen verlassen.
ocodo
0

Je nach Situation besteht eine schnelle Möglichkeit darin, einen Symlink auf dem Remote-System zu erstellen:

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

Verwenden Sie dann das -LFlag, mit rsyncdem angegeben wird, dass dem Verzeichnisinhalt gefolgt werden soll:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Chris Laskey
quelle
Mir gefällt der Gedanke, dass es Zeiten gibt, in denen Symlinking den Ärger der schlechten Benennung oder unnötig komplexer Hierarchien umgeht.
Sridhar Sarnobat
0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

Double Escape funktioniert auch

Andrej Surkov
quelle
-1

Versuchen Sie diesen Weg:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
user94712
quelle