Cómo sincronizar múltiples carpetas de origen

34

Quiero sincronizar múltiples 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

con: más difícil tener estadística agregada

  • Solución 2

crear una tobackupcarpeta que contenga enlace simbólico y usar -Lopciones

sync -aL /home/user/tobackup bkp

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

  • Solución 3

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

rsync -a /home/user/tobackup bkp

con: alguna configuración manual

Cúal me recomiendas ?

¿Hay una mejor manera?

usuario1437346
fuente
fuente remota: stackoverflow.com/questions/15817583/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

33

Puede pasar múltiples argumentos de origen.

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

Esto crea bkp/fstaby bkp/download, como los comandos separados que le diste. Puede ser conveniente preservar la estructura fuente en su lugar. Para hacer esto, use /como fuente y use reglas de inclusión / exclusión para especificar qué archivos copiar. Hay dos maneras de hacer esto:

  • Incluya explícitamente cada archivo, así como cada componente del directorio que lo conduce, con /***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 /*/*/(for /home/user), pero elimine los directorios en los que no se copia ningún archivo. Esto es más conveniente porque no tiene que enumerar a los padres explícitamente. Incluso podría usar en --prune-empty-dirs --include='*/'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 fuera /etcy /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    
Gilles 'SO- deja de ser malvado'
fuente
1
Genial, pero ¿cómo mantener la estructura de directorios dentro de bkp?
Rodrigo
Quiero decir, bkp / etc / fstab y bkp / home / user / dowlonad? ¿O tal vez / bkp / fstab y bkp / download?
Rodrigo
@Rodrigo He editado mi respuesta
Gilles 'SO- deja de ser malvado' el
13

Realmente me gusta la respuesta de Gilles, sin embargo, me gustaría agregar que, desde mi punto de vista, el requisito de sincronizar varias carpetas mientras se preserva la estructura del directorio se cumple mejor pasando múltiples argumentos de origen junto con la --relativeopción.

En este caso, podríamos tener algo de la siguiente manera:

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 controlar esencialmente qué parte de la estructura de directorios queremos replicar en el receptor.
(Consulte la documentación sobre la --relativeopción aquí )

Entonces, si hiciéramos esto

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

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

Christoph
fuente
2

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 sytnax de llaves con cp y ciertas otras utilidades:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
Brad Hein
fuente
¿Cómo especificarías el puerto ssh con esto? Esa sintaxis parece funcionar cuando se usa-e
tcurdt