¿Es posible con rsync no crear directorios en el destino?
Imagina que tengo esa fuente:
a/
a/x.txt
b/
b/y.txt
Y que tengo este destino:
a/
a/z.txt
El resultado deseado de rsync source destination
:
a/
a/x.txt
a/z.txt
Por supuesto, mi situación real implica una estructura de miles de archivos/carpetas y no quiero soluciones que impliquen una lista explícita de carpetas sincronizadas, lo cual puedo hacer.Estoy buscando una forma limpia de evitar la creación de carpetas en el destino.Por exclusión o filtrado... Eso podría incluso ser algo fuera de rsync, como un truco con permisos si rsync no puede hacer esto...
A modo informativo, es muy fácil conseguir este tipo de situaciones, en mi caso tengo:
- Un servidor con 2 discos, digamos
A
&B
. Y un disco localC
. - Normalmente lo uso
rsync
para sincronizar (y fusionar) archivos remotosA
yB
localesC
. - Luego, a veces solo quiero volver a sincronizar algunos
C
archivos enA
yB
. (Solo archivos nuevos... no carpetas que no existen en el destino)
Respuesta1
Pruebe lo siguiente:
rsync -av src:/dir/to/files/* /dest/dir
Si tiene varios subdirectorios anidados, primero deberá hacer algo como esto:
find /dir/to/files -type d -print
Ejecute esa lista de directorios a través de un bucle y llame a rsync cada vez. Por supuesto, suponiendo que esté haciendo esto en una máquina remota, deberá emitir la búsqueda a través de ssh y almacenar los resultados en una matriz y luego ejecutar el bucle rsync.
Respuesta2
Implementé esto para rsync ahora y envié el parche a upstream: https://lists.samba.org/archive/rsync/2015-November/030455.html
Respuesta3
tal vez haga un rsync normal y luego, en un segundo paso, elimine todas las carpetas recién creadas... suena peligroso.
Para aumentar la seguridad de esta operación puede utilizar otro usuario distinto al del sistema de destino:
rsync $src $specialuser@server:$destination
Eliminar las carpetas creadas remotamente por ese usuario:
ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"
Y luego restablezca los permisos a la normalidad:
ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"
Maldita sea, esto se ve sucio... esto necesita algunas mejoras serias :D
Respuesta4
Recomendaría crear un archivo include_file en su objetivo usando un script para agregar /*
a cada línea del resultado de:
busque [dir_destino] -tipo d >[dir_destino]/include.file
Luego, puede usar rsync --include_file=[target_dir]/include.file
para especificar que se incluyan solo los archivos que coincidan con un patrón en ese archivo, que debería ser una lista completa de carpetas en el destino bajo el punto que especificó.
Si crea una secuencia de comandos para hacer esto cada vez, su lista en include.file siempre estará actualizada. De lo contrario, puede decidir simplemente actualizarlos (uno en cada servidor al que desee volver a sincronizar) de vez en cuando.
Si tengo tiempo más tarde, publicaré aquí un script de Python utilizable, pero esto debería brindarle un buen camino a seguir.