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

Respuestas:


8

Tratar

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


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


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

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

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

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


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

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

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

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


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

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

doble escape también funciona


-1

Intenta de esta manera:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.