web-dev-qa-db-fra.com

Comment rsync sur ssh lorsque les noms de répertoire ont des espaces

J'essaye de rsync d'un serveur à l'autre. Les serveurs ont la même structure de répertoires, mais j'ai du mal à faire en sorte que le serveur de télécommandes reconnaisse correctement le nom de chemin sur la télécommande lorsqu'il y a de l'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 tout essayé, 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"

lorsque cela s'exécute, la première chose qu'il signale 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

mnt/xlses/split/v2/name with space
81
PyNEwbie

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 de fin / depuis le chemin du répertoire source. Cela fera rsync copier le répertoire et tout son contenu, ce qui signifie que rsync s'inquiétera d'obtenir le nom correct sur l'hôte distant (ce qu'il fera) au lieu de vous.

8
dg99

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 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 étendus sur l'hôte distant par rsync (au lieu que le shell le fasse). [...]

146
johnLate

Cela fonctionne en bash: Échappez aux 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// /\\ }" .
42
teekarna

Utilisez deux paires de guillemets

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 guillemets doubles entre guillemets simples :

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

Plus d'infos

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

Si vous voulez un * à interpréter sur le serveur plutôt que sur le client, le * doit apparaître à l'intérieur d'une seule des 2 paires de guillemets. Je trouve cela contre-intuitif car, logiquement, la paire de guillemets externe échappe à l'interprétation du client, tandis que la paire de guillemets interne échappe à l'interprétation du serveur.

Protéger les Args

L'avantage, par rapport au --protect-args solution , c'est que vous n'avez en fait pas les restrictions de --protect-args, donc vous pouvez utiliser des caractères spéciaux tels que ~ ou $. Vous pouvez donc écrire:

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

ou

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

Notez que le tilde (~) dans ce dernier exemple doit être extérieur les guillemets doubles.

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

19
Sridhar Sarnobat

Je comprends que c'est une vieille question, mais j'ai pensé que j'allais ajouter à l'ensemble des connaissances existantes.

J'ai utilisé rsync avec 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 rsync sont 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*" .
    
6
Gokul Wimalanathan

De manière générale, citez l'argument et échappez les espaces dans l'argument. 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"
3
James

À partir des pages de manuel rsync:

   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
1
Shammel Lee

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

Utilisez ensuite le -L drapeau dans rsync qui lui dit de suivre le contenu du répertoire:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
0
Chris Laskey

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

Évidemment, la configuration sur la machine de destination affecte la façon dont les arguments sont analysés et nous devons avoir quelque chose de configuré 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, donc j'ai fait cela

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 nom si j'avais plusieurs répertoires, cela ne fonctionnerait pas.

En fin de compte, je dois comprendre comment configurer le serveur distant pour qu'il puisse analyser le nom de chemin plus efficacement - je n'utilise jamais d'espaces dans les noms de répertoire, mais la personne qui l'a configuré l'a fait et au moins pour l'instant je suis coincé

0
PyNEwbie
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

double escape fonctionne aussi

0
Andrej Surkov