rsync sincroniza archivos solo sin crear carpetas en el destino

rsync sincroniza archivos solo sin crear carpetas en el destino

¿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 local C.
  • Normalmente lo uso rsyncpara sincronizar (y fusionar) archivos remotos Ay Blocales C.
  • Luego, a veces solo quiero volver a sincronizar algunos Carchivos en Ay B. (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.filepara 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.

información relacionada