Respuestas:
Si tiene más de la última hoja de directorio para crear, puede ejecutar un ssh ... mkdir -p
primero por separado o usar el --rsync-path
truco 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 --relative
opció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 --relative
comenzar:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
crearía / pre_existing / dir / y / z /.
&&
?
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
rsync
, por lo tanto, sin respuesta.
ssh
no es compatible y se rsync
conecta al rsync daemon
extremo remoto.
La -R, --relative
opción hará esto.
Por ejemplo: si desea hacer una copia de seguridad /var/named/chroot
y crear la misma estructura de directorios en el servidor remoto, entonces -R
hará exactamente eso.
/./
la ruta de origen. Vea la página del manual para más detalles.
rsync
no creará directorios automáticamente si las carpetas de destino no existen. Suspiro.
--relative
. Puede que no haga lo que piensas.
--relative
en 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.
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.
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
rsync /dev/null node:existing-dir/new-dir/
sugerencia arriba.
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 myappdata
directorio 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 -rvv
flag 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 user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine'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.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
pero lo que creó en el destino es / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
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.