Usar rsync para mantener una copia de un directorio con un nombre que cambia

Usar rsync para mantener una copia de un directorio con un nombre que cambia

Estoy usando rsync en un sistema Linux para sincronizar un directorio entre el disco local y una unidad USB conectada. El problema que estoy experimentando es que el sistema de terceros que crea la copia de seguridad diariamente en el servidor en realidad cambia el nombre de un directorio anidado en lo profundo de la copia de seguridad. Este directorio tiene la mayoría de los datos necesarios en la copia de seguridad. Cuando rsync mira el directorio, ve que el nombre ha cambiado y lo considera un directorio totalmente nuevo. Entonces mi copia rsync en la unidad USB tiene un nuevo directorio para cada día que se ejecuta.

He escrito scripts que realmente cambiarán el nombre del directorio, ¡pero es una forma engorrosa de hacerlo!

Estoy buscando una forma "elegante" de abordar esto. ¿Es posible crear un enlace al directorio que permanezca constante? ¿Se puede configurar rsync para detectar que el directorio es el mismo aunque se cambie el nombre? ¡Estoy seguro de que alguien ha tenido que lidiar con esto antes!

Respuesta1

Un enfoque sería hacerlo en dos pasos. Primero, sincronice todo excepto el directorio en cuestión utilizando patrones de ignoración. Segundo, rsync solo el directorio usando globbing en bash para llegar al directorio, así:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

El uso de una barra diagonal al final del directorio de origen hará que rsync ignore el nombre del directorio, ya que será invocado en elcontenidodel directorio en lugar del directorio en sí. Por supuesto, esta globalización será más fácil si el directorio se nombra con un prefijo o sufijo constante como en mi ejemplo anterior. Si no es así, puedes escribir un script para averiguar el nombre real del directorio y hacer algo más directo como esto:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

Al final, tu pseudocódigo sería algo como esto:

  1. Buscar $BIGDATADIRNAME
  2. Rsync todo como estaba antes, pero ignora $BIGDATADIRNAME
  3. sincronizar elcontenidode $BIGDATADIRNAME

Respuesta2

Es posible que pueda utilizar las opciones de rsync--comparar-dest=DIR,--copy-dest=DIR, o--link-dest=DIR. Le permiten especificar un directorio adicional en el extremo receptor para buscar archivos faltantes.

Usando --link-dest, por ejemplo, rsync crearía la nueva versión del directorio que contiene nuevas copias de archivos que habían cambiado, o copias vinculadas de archivos que no habían cambiado.

Para usar cualquiera de estas opciones, deberá conocer el nombre del directorio en la unidad USB de la ejecución anterior de rsync, por lo que probablemente querrá incluir rsync en un script que determine primero el nombre correcto del directorio.

Es posible que también desee utilizar --delete-after para eliminar las versiones antiguas del directorio después de crear la nueva versión.

Respuesta3

Rsync por sí solo no puede hacer lo que usted quiere, porque los únicos metadatos que rsync tiene disponibles son el nombre del directorio y MACtimes.

La única forma de manejarlo automáticamente dentro de rsync sería que rsync de alguna manera tenga más metadatos. La replicación DFS de Microsoft en Windows, por ejemplo, maneja esto usando la ID única asignada a los archivos en un volumen NTFS para detectar cuando cambia el nombre de un archivo (o directorio).

Su script poco elegante es probablemente la forma más fácil de hacer lo que quiere sin deshacerse de rsync y buscar otra herramienta.

Usar un enlace simbólico no funcionará porque el punto de unión está vinculado al nombre del directorio de destino (y el nombre del directorio de destino cambiaría, en este caso). Podría usar un enlace físico (que está vinculado al inodo), pero debe asegurarse de que el nombre del directorio cambie en lugar de simplemente eliminarlo y volver a crearlo (lo que le asignaría un inodo diferente).

información relacionada