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
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.
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). [...]
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// /\\ }" .
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"' .
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.
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'" .
)
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.
Local - Notez le manque de guillemets.
rsync -avu /media/data/The\ Folder* .
Remote - Notez la présence de guillemets
rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
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"
À 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
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
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é
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space
double escape fonctionne aussi