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/ root@myserver.com:/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

Antworten:


8

Versuchen

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/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.


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/ "root@myserver.com:/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). [...]


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 me@some.server.com:"/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 me@some.server.com:"${remote_path// /\\ }" .

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 me@myserver.com:"'/home/me/test file'" .

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

ssh me@myserver.com:'"/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 "me@myserver.com:'/home/me/test file'" .).


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 you@domain.com:"/media/data/The\ Folder*" .
    

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/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

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

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/ root@myserver.com:/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


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

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/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

Double Escape funktioniert auch


-1

Versuchen Sie diesen Weg:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.