Comment rsync sur ssh quand les noms de répertoires ont des espaces

71

J'essaye de rsync d'un serveur à l'autre. Les serveurs ont la même structure de répertoire, mais je ne parviens pas à faire en sorte que le serveur de télécommandes reconnaisse correctement le nom du chemin d'accès sur la télécommande lorsqu'il y a un espace.

Voici les détails

Le répertoire local est

mnt/xlses/split/v2/name with space

Le répertoire distant est

mnt/xlses/split/v2/name with space

J'ai essayé tout ce que je peux trouver la dernière tentative a été

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

quand cela fonctionne la première chose qu'il rapporte est qu'il crée un nouveau répertoire

Je l'interromps et vois qu'il y a un nouveau répertoire

mnt/xlses/split/v2/name

tous mes fichiers sont dans ce répertoire

Je m'attendais à ce qu'ils soient en

mnt/xlses/split/v2/name with space
PyNEwbie
la source

Réponses:

8

Essayer

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

J'ai enlevé la barre oblique finale /du chemin du répertoire source. Cela fera rsynccopier le répertoire et tout son contenu, ce qui signifie rsyncque vous aurez peur d'obtenir le nom correct sur l'hôte distant (ce qui sera le cas) à votre place.

dg99
la source
9
Cela n'a pas fonctionné pour moi, mais la réponse de JohnLate a fonctionné.
Adriaan Tijsseling
Cela n'explique pas comment traiter les espaces du côté distant.
ckujau
cela ne fonctionne pas, comme indiqué.
Lizardx
128

Essayer

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

De man rsync:

-s, --protect-args

Cette option envoie tous les noms de fichiers et la plupart des options au serveur rsync distant sans permettre au shell distant de les interpréter. Cela signifie que les espaces ne sont pas divisés en noms et que les caractères spéciaux non génériques ne sont pas traduits (tels que ~, $,;,, &, etc.). Les caractères génériques sont développés sur l'hôte distant par rsync (au lieu de le faire par le shell). [...]

johnLate
la source
13
Cela ne fonctionne pas pour Mac.
Matt Alexander
8
Fonctionne sur Mac si vous installez une version récente de rsync en utilisant home-brew.
Adriaan Tijsseling
4
Vérifiez si cela se trouve dans votre version de rsync en exécutant man rsyncet en effectuant une recherche ( /s) pour "--protect". Pour installer avec homebrew: brew install homebrew/dupes/rsyncSi non trouvé, lancez brew search rsync.
MikeiLL
12
La nouvelle version de l’installation n’est pas nécessaire, il vous suffit d’échapper des espaces ET de citer l’hôte / le nom du fichier - par exemplersync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo
Cela devrait être la réponse acceptée.
Josh M.
39

Cela fonctionne dans bash: échappez les espaces avec une barre oblique inverse, puis utilisez des guillemets:

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

Ou si vous avez le chemin dans la variable $ remote_path, les espaces peuvent être échappés avec substitution:

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
la source
1
Cela a fonctionné pour moi. M'a sauvé de devoir travailler sur un serveur Mac.
George
1
Cela devrait être marqué la bonne réponse. La clé est que vous avez besoin de barres obliques inverses et de guillemets.
Sridhar Sarnobat
4
Double échapper est une douleur, l' -soption fonctionne sur n'importe quelle version moderne de rsync et est conçue pour résoudre ce problème
Mark K Cowan
Remarque : si vous copiez à partir d' un serveur distant avec un espace dans le chemin d'un chemin local avec l' espace, vous ne devez ajouter les guillemets pour le chemin à distance .
lenooh
La solution de @teekarna a fonctionné pour moi. Selon la page de manuel "rsync", alternative consiste à utiliser "--protect-args" ou "-s" - cela a également fonctionné pour moi.
Kishan Parekh
14

Utilisez deux paires de citations

Ne vous embêtez pas avec toutes les barres obliques inverses, utilisez simplement des guillemets simples entre guillemets doubles :

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

Vous pouvez également utiliser l'inverse, c'est-à-dire les guillemets doubles à l'intérieur de guillemets simples :

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

Plus d'infos

Caractères génériques côté serveur

Si vous voulez *interpréter un message sur le serveur plutôt que sur le client, vous *devez le placer dans une des deux paires de guillemets. Je trouve cela contre-intuitif car, logiquement, les guillemets externes échappent à l'interprétation du client, tandis que les guillemets intérieurs échappent à l'interprétation du serveur.

Protéger les args

L'avantage, par rapport à la --protect-argssolution , est que vous n'avez pas les restrictions de la --protect-args, vous pouvez donc utiliser des caractères spéciaux tels que ~ou$ . Pour que vous puissiez écrire:

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

ou

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

Notez que le tilde ( ~) dans le dernier exemple doit être en dehors des guillemets doubles.

Vous pouvez mettre l’une des paires de guillemets tout autour du nom d’utilisateur @ hôte: partie du fichier (par exemple ssh "[email protected]:'/home/me/test file'" .) .

Sridhar Sarnobat
la source
En fait, votre suggestion de ne pas mettre la partie hôte entre guillemets est plus perspicace, il est donc tentant de faire de cette page la première ligne du message.
Sridhar Sarnobat
2
Cette solution est géniale! Travaillé comme il était sur la boîte avec rsync sur SSH.
Ikon
Quand vous y réfléchissez, les 2 paires de guillemets sont tout à fait logiques: la paire de guillemets externe sert à ce que le client la traite de manière indivisible (dont le contenu est transmis intégralement au serveur) et la paire de guillemets interne au serveur. reconnaître l'indivisibilité.
Sridhar Sarnobat
Cette réponse est sous-estimée.
Derple
6

Je comprends que c’est une vieille question, mais j’ai pensé que j’ajouterais au corpus de connaissances existant.

J'ai utilisé rsyncavec plusieurs dossiers avec de l'espace et cela fonctionne. J'ai des dossiers numérotés de 1 à 10 comme suit:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

Les 2 instances que vous souhaitez utiliser rsyncsont locales et distantes.

  1. Local - Notez le manque de guillemets.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remote - Notez la présence de guillemets

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

De manière générale, citez l'argument et échappez aux caractères d'espacement. Dans l'exemple que vous avez donné, essayez:

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

À partir des rsyncpages de manuel:

   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
la source
0

Eh bien, je vais répondre à cette question moi-même, bien que quelqu'un d'autre puisse mieux l'expliquer.

Il est évident que la configuration de la machine de destination affecte la façon dont les arguments sont analysés et que nous devons avoir quelque chose qui rend difficile l’utilisation de guillemets ou de barres obliques pour échapper aux espaces, mais nous pouvons utiliser des caractères génériques, c’est ce que j’ai fait.

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

Cela fonctionne pour moi car il n'y a qu'un seul répertoire qui commence par name si j'avais plusieurs répertoires, cela ne fonctionnerait pas.

En fin de compte, je dois comprendre comment configurer le serveur distant de manière à ce qu'il puisse analyser plus efficacement le nom du chemin d'accès. Je n'utilise jamais d'espaces dans les noms de répertoires, mais la personne qui les a configurés l'a fait et au moins pour l'instant, je suis bloquée.

PyNEwbie
la source
Votre proposition ne fonctionne que parce que vous avez déjà créé le répertoire de destination lors de votre première tentative (infructueuse). Voir ma réponse pour un moyen plus simple (qui a également l'avantage de ne pas compter sur une première tentative ratée :).
dg99
En fait, le répertoire existait déjà. Vous n'êtes pas correct dans ma tentative a échoué , il a créé le répertoire / ~ / nom pas / ~ / nom avec l' espace I supprimé / ~ / nom et a continué à essayer différentes options Le répertoire / ~ / nom avec l' espace existait déjà je tentais d'ajouter des fichiers à elle
PyNEwbie
Oh, je vois ce que tu veux dire.
dg99
Fonctionne si vous citez l'hôte / chemin et évacuez les espaces.
octobre
0

Selon la situation, une option rapide consiste à créer un lien symbolique sur le système distant:

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

Ensuite, utilisez le -Ldrapeau dans rsynclequel il est indiqué de suivre le contenu du répertoire:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Chris Laskey
la source
J'aime la pensée, il arrive parfois que les liens symboliques contournent le problème des noms mal hiérarchisés ou des hiérarchies inutilement complexes.
Sridhar Sarnobat
0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

la double évacuation fonctionne aussi

Andrej Surkov
la source
-1

Essayez de cette façon:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
utilisateur94712
la source