rsync: ¿cómo puedo configurarlo para crear un directorio de destino en el servidor?

143

Me gustaría rsyncdesde la computadora local al servidor. En un directorio que no existe, y rsyncprimero quiero crear ese directorio en el servidor.

¿Cómo puedo hacer eso?

ufk
fuente

Respuestas:

161

Si tiene más de la última hoja de directorio para crear, puede ejecutar un ssh ... mkdir -pprimero por separado o usar el --rsync-pathtruco como se explica aquí :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

O use la --relativeopción sugerida por Tony. En ese caso, solo especifica la raíz del destino, que debe existir, y no la estructura de directorios de la fuente, que se creará:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

De esta manera, terminará con / pre_existing / dir / new / x / y / z /

Y si desea que se cree "y / z /", pero no dentro de "new / x /", puede agregar ./dónde desea --relativecomenzar:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

crearía / pre_existing / dir / y / z /.

mivk
fuente
2
El servidor al que estoy accediendo no tiene mkdir, así que estoy usando el hack: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \crea un archivo adicional pero puedes eliminarlo más tarde.
Fabiano Soriani
1
Esto no parece estar funcionando en los nuevos protocolos rsync, obtengo un error similar al siguiente cuando uso && o; en --rsync-path caracteres no válidos en el comando scp! aquí: && / usr / bin / rsync
ghitesh
@ghitesh, ¿intentaste escapar de la &&?
Felipe Alvarez
@FelipeAlvarez Sí, lo hice, pero no funcionó. No puedo encontrar el enlace ahora, pero algunos documentos dicen que esto está solucionado, ya que creo que podría (y fue) explotado.
ghitesh
Gracias, esto funciona. En mi caso, estaba ejecutando un script bash local en un servidor remoto y dentro de eso ejecutaba el comando ssh mkdir que se estaba ejecutando, pero luego eliminaba el resto del script antes de ejecutar el comando rsync. Esto permite que el resto del script se ejecute sin problemas.
johndavid400
33

Suponiendo que está utilizando ssh para conectar rsync, ¿qué hay de enviar un comando ssh antes:

ssh user@server mkdir -p existingdir/newdir

si ya existe, no pasa nada

Alfredo Yong
fuente
44
La solicitud de ufk es para la sintaxis que causará que "rsync cree [un directorio faltante] en el servidor [&& copie los archivos]". Su respuesta es válida porque creará el directorio de destino faltante en el servidor ... pero no con rsync, por lo tanto, sin respuesta.
TomRoche
Esta no es una opción si sshno es compatible y se rsyncconecta al rsync daemonextremo remoto.
Krzysztof Jabłoński
19

La -R, --relativeopción hará esto.

Por ejemplo: si desea hacer una copia de seguridad /var/named/chrooty crear la misma estructura de directorios en el servidor remoto, entonces -Rhará exactamente eso.

Tony
fuente
12
También puede especificar solo una parte de la ruta que se creará utilizando /./la ruta de origen. Vea la página del manual para más detalles.
Marki555
20
¿Por qué votar? La respuesta es incorrecta, rsyncno creará directorios automáticamente si las carpetas de destino no existen. Suspiro.
zeekvfu
3
Recomiendo encarecidamente a los lectores que consulten la página de manual --relative. Puede que no haga lo que piensas.
FiloSottile
3
--relativo pega la ruta completa, en lugar del archivo, en el punto final que proporciona en el servidor. Normalmente /tmp/foo/bar/file.c a remoto: / tmp produciría remoto: /tmp/file.c pero con -R crea /tmp/foo/bar/file.c No use esta opción a menos que Si sabe lo que está haciendo, obtendrá una estructura de directorios realmente desordenada.
Cormac Mulhall
77
El comentario de @ Marki555 es clave para el éxito. --relativeen conjunto con /./es lo que la mayoría de los novatos estarán buscando. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/copiará el contenido del escritorio al escritorio de destino. No sé cómo las diferencias en los nombres de usuario pueden afectar esto.
Daniel F
15

esto funcionó para mí:

 rsync /dev/null node:existing-dir/new-dir/

Recibo este mensaje:

skipping non-regular file "null"

pero no tengo que preocuparme por tener un directorio vacío dando vueltas.

kdubs
fuente
Gracias por la respuesta kdubs. Eso funcionó muy bien. Entonces, si quiero mantener los archivos que estoy sincronizando dentro de la carpeta que estoy señalando como la fuente, entonces solo necesito especificarlo y se crea. ex: rsync -avph / mytest / / otherfolder / mytest / Luego obtengo el resultado "directorio creado / otherfolder / mytest"
mbrinson
1
No olvide la barra diagonal ('/') al final de new-dir, de lo contrario creará un archivo que no sea de directorio.
tartaruga_casco_mole
4

No creo que pueda hacerlo con un comando rsync, pero puede 'crear previamente' el directorio adicional primero de esta manera:

rsync --recursive emptydir/ destination/newdir

donde 'emptydir' es un directorio vacío local (que es posible que primero deba crear como directorio temporal).

Es un truco, pero funciona para mí.

salud

Chris

Chris Dennis
fuente
No es necesario usar una carpeta temporal. Ver rsync /dev/null node:existing-dir/new-dir/sugerencia arriba.
lucid_dreamer
3

Esta respuesta utiliza fragmentos de otras respuestas, pero espero que sea un poco más claro en cuanto a las circunstancias. Nunca especificó lo que estaba sincronizando: una sola entrada de directorio o varios archivos.

Así que supongamos que está moviendo una entrada de directorio de origen, y no solo moviendo los archivos contenidos en ella.

Digamos que tiene un directorio llamado localmente data/myappdata/y tiene una carga de subdirectorios debajo de esto. Tiene data/en su máquina de destino pero no data/myappdata/, esto es bastante fácil:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

Incluso puede usar un nombre diferente para el directorio remoto:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

Si solo está moviendo algunos archivos y no está moviendo la entrada del directorio que los contiene, entonces haría:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

y creará el myappdatadirectorio para usted en la máquina remota para colocar sus archivos. Nuevamente, el data/directorio debe existir en la máquina remota.

Por cierto, mi uso de -rvvflag es obtener resultados doblemente detallados para que quede claro lo que hace, así como el comportamiento recursivo necesario.

Solo para mostrarle lo que obtengo cuando uso rsync (3.0.9 en Ubuntu 12.04)

$ rsync -rvv *.txt [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected]'s password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

Espero que esto aclare esto un poco.

Mandíbula79
fuente
Esto no funciona exactamente como se esperaba. Intenté el primer comando rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdatapero lo que creó en el destino es / remote / path / to / data / myappdata / myappdata /
harleygolfguy
Si hago un ligero cambio en su primer comando y agrego una barra '/' después de la ruta de origen, entonces funciona ... así: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy
2

p.ej:

de: /xxx/a/b/c/d/e/1.html

a: usuario @ remoto: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_existing / dir /

Montaje
fuente