Cómo rsync sobre ssh cuando los nombres de directorio tienen espacios

71

Estoy tratando de sincronizar de un servidor a otro. Los servidores tienen la misma estructura de directorio, pero tengo problemas para que el servidor de control remoto reconozca correctamente el nombre de la ruta en el control remoto cuando hay un espacio en él.

Aquí están los detalles

El directorio local es

mnt/xlses/split/v2/name with space

El directorio remoto es

mnt/xlses/split/v2/name with space

He intentado todo lo que puedo encontrar, el último intento fue

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

cuando eso se ejecuta, lo primero que informa es que está creando un nuevo directorio

Lo interrumpo y veo que hay un nuevo directorio

mnt/xlses/split/v2/name

todos mis archivos están en ese directorio

Esperaba que estuvieran en

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

Respuestas:

8

Tratar

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

Quité la barra diagonal /de la ruta del directorio de origen. Esto hará que rsynccopie el directorio y todo su contenido, lo que significa que rsyncse preocupará por obtener el nombre correcto en el host remoto (que lo hará) en lugar de usted.

dg99
fuente
9
Esto no funcionó para mí, pero la respuesta de JohnLate sí.
Adriaan Tijsseling
Esto no explica cómo lidiar con espacios en el lado remoto.
ckujau
esto no funciona, como se señaló.
Lizardx
128

Tratar

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

Esta opción envía todos los nombres de archivo y la mayoría de las opciones al rsync remoto sin permitir que el shell remoto los interprete. Esto significa que los espacios no se dividen en nombres, y los caracteres especiales que no son comodines no se traducen (como ~, $,;, &, etc.). Los comodines se expanden en el host remoto mediante rsync (en lugar del shell que lo hace). [...]

johnLate
fuente
13
Esto no funciona para Mac.
Matt Alexander
8
Funciona en Mac si instala una versión reciente de rsync usando home-brew.
Adriaan Tijsseling
44
Vea si está en su versión de rsync ejecutando man rsyncy buscando ( /s) "--protect". Para instalar con homebrew: brew install homebrew/dupes/rsyncSi no lo encuentra, ejecute brew search rsync.
MikeiLL
12
La instalación de la nueva versión es innecesaria, simplemente escapa de espacios Y cita el host / nombre de archivo - por ejemplorsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo
Esta debería ser la respuesta aceptada.
Josh M.
39

Esto funciona en bash: escapa de los espacios con una barra diagonal inversa y luego usa comillas:

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

O si tiene la ruta en la variable $ remote_path, los espacios se pueden escapar con sustitución:

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
fuente
1
Eso funcionó para mí. Me salvó de tener que trabajar en un servidor Mac.
George
1
Esto debe marcarse como la respuesta correcta. La clave es que necesita barras invertidas y comillas.
Sridhar Sarnobat
44
El doble escape es una molestia, la -sopción funciona en cualquier versión moderna de rsync y está diseñada para resolver este problema
Mark K Cowan
Nota : si está copiando desde un servidor remoto con un espacio en la ruta a una ruta local con espacio, solo necesita agregar las comillas a la ruta remota .
lenooh
La solución de @teekarna funcionó para mí. Según la página de manual "rsync", la alternativa es usar "--protect-args" o "-s", que también funcionó para mí.
Kishan Parekh
14

Usa dos pares de comillas

No te molestes con todas las barras invertidas, solo usa comillas simples dentro de comillas dobles :

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

También puede usar el reverso, es decir, comillas dobles dentro de comillas simples :

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

Informacion adicional

Comodines en el lado del servidor

Si quieres una *debe ser interpretada en el servidor en lugar del cliente, el *debe llegar dentro de uno de los 2 pares de comillas. Encuentro esto contrario a la intuición porque lógicamente el par de comillas externo escapa a la interpretación del cliente, mientras que el par de comillas interno escapa a la interpretación del servidor.

Proteger Args

La ventaja, en comparación con la --protect-argssolución , es que en realidad no tiene las restricciones de --protect-args, por lo que puede usar caracteres especiales como ~o$ . Entonces puedes escribir:

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

o

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

Tenga en cuenta que tilde ( ~) en el último ejemplo debe estar fuera de las comillas dobles.

Puede poner uno de los pares de comillas alrededor del nombre de usuario completo @ host: parte del archivo (por ejemplo ssh "[email protected]:'/home/me/test file'" .)

Sridhar Sarnobat
fuente
En realidad, su sugerencia de no poner la parte del host entre comillas es más perspicaz, por lo que es tentador hacer de esta la primera línea de la publicación.
Sridhar Sarnobat
2
¡Esta solución es brillante! Funcionó como estaba en la lata con rsync sobre ssh.
Ikon
Cuando lo piensa, los dos pares de citas son completamente lógicos: el par externo de citas es para que el cliente lo trate indivisiblemente (el contenido de las cuales se pasa al servidor textualmente) y el par interno de citas es para el servidor reconocer la indivisibilidad.
Sridhar Sarnobat
Esta respuesta está subestimada.
Derple
6

Entiendo que esta es una vieja pregunta, pero pensé que agregaría al cuerpo de conocimiento existente.

Lo he usado rsynccon múltiples carpetas con espacio y esto funciona. Tengo carpetas numeradas del 1 al 10 de la siguiente manera:

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

Las 2 instancias que desea utilizar rsyncson locales y remotas.

  1. Local : tenga en cuenta la falta de comillas.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remoto : tenga en cuenta la presencia de comillas

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

En términos generales, cita el argumento y escapa de los caracteres de espacio en el argumento. En el ejemplo que diste, prueba:

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

De las rsyncpáginas del manual:

   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
fuente
0

Bueno, voy a responder esta pregunta yo mismo, aunque alguien más podría explicarlo mejor.

Evidentemente, la configuración en la máquina de destino afecta la forma en que se analizan los argumentos y debemos tener algo configurado que dificulte el uso de comillas o barras para escapar de los espacios, pero podemos usar comodines, así que hice esto

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

Esto funciona para mí porque solo hay un directorio que comienza con el nombre si tuviera varios directorios, esto no funcionaría.

Finalmente, necesito entender cómo configurar el servidor remoto para que pueda analizar el nombre de la ruta de manera más eficiente: nunca uso espacios en los nombres de directorio, pero la persona que configuró esto lo hizo y al menos por ahora estoy atascado

PyNEwbie
fuente
Su propuesta solo funciona porque ya creó el directorio de destino durante su primer intento (fallido). Vea mi respuesta para una forma más fácil (que también tiene la ventaja de no confiar en un primer intento fallido :).
dg99
Bueno, en realidad el directorio ya existía. No está correcto en mi intento fallido, creó el directorio / ~ / name not / ~ / name con Space que eliminé / ~ / name y seguí probando diferentes opciones. El directorio / ~ / name con espacio ya existía. Estaba tratando de agregar archivos. a ella
PyNEwbie
Oh, ya veo lo que quieres decir.
dg99
Funciona si cita el host / ruta y escapa de los espacios.
ocodo
0

Dependiendo de la situación, una opción rápida es crear un enlace simbólico en el sistema remoto:

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

Luego use la -Lbandera en la rsyncque le dice que siga los contenidos del directorio:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space
Chris Laskey
fuente
Me gusta pensar, hay momentos en los que la simulación pasa por alto la molestia de nombrar mal o jerarquías innecesariamente complejas.
Sridhar Sarnobat
0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

doble escape también funciona

Andrej Surkov
fuente
-1

Intenta de esta manera:

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