Saltar al contenido →

Sincronizar contenido entre carpetas con rsync

Una tarea con la que me he enfrentado administrando servidores Linux es sincronizar el contenido de un directorio con otro (sin usar un tercer servicio como subversion o git), ya sea porque se está haciendo una migración de servidor o porque se requiere sincronizar ciertos archivos entre directorios.
Desde la terminal y con el uso del comando rsync esto es tarea sencilla. Incluso el comando tiene mucho más potencial del uso trivial que comparto aquí.

Para sincronizar el contenido entre dos directorios


$ rsync -a dir1/ dir2/

Esto copiara o actualizará todo el contenido del directorio dir1 en dir2. Al pasarle el parámetro -a, le estamos pidiendo al commando rsync que en la transferencia de los archivos se preserve symbolic links, permisos, propietario, etc.

Si sólo queremos copiar o actualizar cierto tipo de archivos entre dos directorios se puede hacer pasando un patrón


$ rsync -a -vz dir1/*.java dir2/

En este ejemplo, rsync sólo copiará o actualizará todos los archivos con extensión .java, adicionalmente le hemos pasado el parámentro -vz, donde -v (verbose) nos mostrará en pantalla todos los archivos que fueron transferidos y de esta forma podemos conocer qué fue lo que se copió o se actualizó. Por el otro lado el parámetro -z, comprime los archivos durante su transferencia. Esto último es útil cuando estás sincronizando directorios entre dos computadoras o servidores. Por ejemplo para sincronizar los archivos entre un directorio remoto y uno local se haría de la siguiente manera


$ rsync -vz -rsh=ssh user@servidor.xyz:remote_dir/ local_dir/
receiving incremental file list
flushiptables.sh
iptables.sh
monitor.sh

sent 157 bytes  received 4.24K bytes  1.76K bytes/sec
total size is 12.22K  speedup is 2.78

En este último ejemplo vale la pena pasar el parámetro -z para comprimir los archivos durante su transferencia.

Una última cosa útil que quiero agregar acerca de rsync especialmente cuando transfieres archivos vía remota con SCP, es que vía SCP si la conexión se cae debes volver a iniciar la descarga, en cambio con rsync puedes retomar la transferencia donde se quedó usando el parámetro -P


$ scp user@servidor.xyz:remote_dir/archivogigante.gz local_dir/
archivogigante.gz                                            22%  127MB  54.9MB/s
^C
$ rsync -P -vz -rsh=ssh user@servidor.xyz:remote_dir/archivogigante.gz local_dir/archivogigante.gz
receiving incremental file list
archivogigante.gz
        576.19M 100%   19.21MB/s    0:00:30 (xfr#1, to-chk=0/1)

sent 89.53K bytes  received 413.15M bytes  11.64M bytes/sec
total size is 576.19M  speedup is 1.39

Publicado en Linux