Cómo sincronizar varias carpetas de origen

Cómo sincronizar varias carpetas de origen

Quiero sincronizar varias fuentes y me pregunto cuál es la mejor manera de lograrlo.

p.ej

/etc/fstab
/home/user/download

Pensé en 3 soluciones:

  • Solución 1

llamada múltiple a rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

Desventaja: es más difícil tener estadísticas agregadas

  • Solución 2

cree una tobackupcarpeta que contenga un enlace simbólico y use -Lopciones

sync -aL /home/user/tobackup bkp

Desventaja: el contenido de la copia de seguridad no debe contener enlaces simbólicos

  • Solución 3

mover archivos a una copia de seguridad y crear un enlace simbólico en la ubicación original

rsync -a /home/user/tobackup bkp

desventaja: alguna configuración manual

Cúal me recomiendas ?

¿Existe una mejor manera?

Respuesta1

Puede pasar múltiples argumentos fuente.

rsync -a /etc/fstab /home/user/download bkp

Esto crea bkp/fstaby bkp/download, al igual que los comandos separados que diste. En su lugar, puede ser conveniente preservar la estructura fuente. Para hacer esto, use /como fuente y usereglas de inclusión y exclusiónpara especificar qué archivos copiar. Hay dos maneras de hacer esto:

  • Incluya explícitamente cada archivo, así como cada componente del directorio que conduce a él, /***al final de los directorios cuando desee copiar todo el árbol de directorios:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Incluya todos los directorios de nivel superior con /*/(para que rsync atraviese /etcy /homecuando busque archivos para copiar) y directorios de segundo nivel con /*/*/(para /home/user), pero elimine los directorios en los que no se copia ningún archivo. Esto es más conveniente porque no es necesario incluir a los padres explícitamente. Incluso podría usarlo --prune-empty-dirs --include='*/'en lugar de contar el número de niveles, pero esto no es práctico aquí ya que rsync atravesaría todo el sistema de archivos para explorar directorios a pesar de que ninguna de las reglas de inclusión puede coincidir con nada externo /etca y /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

Respuesta2

Realmente me gusta la respuesta de Gilles, sin embargo, me gustaría agregar que, en mi opinión, el requisito de sincronizar varias carpetas preservando la estructura del directorio se cumple mejor pasando múltiples argumentos fuente junto con la --relativeopción.

En este caso, podríamos tener algo como lo siguiente:

rsync -aR /etc/fstab /home/user/download bkp

lo que resultaría en bkp/etc/fstaby bkp/home/user/download.

La mejor parte de esto es que (creo que desde rsync v. 2.6.7) podemos, en esencia, controlar qué parte de la estructura de directorios queremos replicar en el destino.
(Ver documentación sobre la --relativeopciónaquí)

Entonces, por ejemplo, si hiciéramos esto

rsync -aR /home/./user1/download /home/./user2/download bkp

terminaríamos con bkp/user1/downloady bkp/user2/download.

Respuesta3

Esto también funciona: llaves, que contienen una lista de fuentes separadas por comas.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Algo similar a lo que sucede cuando invocas la sintaxis de llaves con cp y otras utilidades:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

información relacionada