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 tobackup
carpeta que contenga un enlace simbólico y use -L
opciones
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/fstab
y 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/etc
y/home
cuando 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/etc
a 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 --relative
opció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/fstab
y 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 --relative
opciónaquí)
Entonces, por ejemplo, si hiciéramos esto
rsync -aR /home/./user1/download /home/./user2/download bkp
terminaríamos con bkp/user1/download
y 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