Cómo usar Rsync para sincronizar directorios locales y remotos

Introducción

Rsync, que significa «sincronización remota», es una herramienta de sincronización de archivos remotos y locales. Utiliza un algoritmo que minimiza la cantidad de datos copiados moviendo sólo las partes de los archivos que han cambiado.

En esta guía, cubriremos el uso básico de esta poderosa utilidad.

¿Qué es Rsync?

Rsync es una herramienta de sincronización habilitada para la red muy flexible. Debido a su ubicuidad en Linux y sistemas similares a Unix y a su popularidad como herramienta para los scripts del sistema, se incluye en la mayoría de las distribuciones de Linux por defecto.

Sintaxis básica

La sintaxis básica de rsynces muy sencilla, y funciona de forma similar a ssh, scp y cp.

Crearemos dos directorios de prueba y algunos archivos de prueba con los siguientes comandos:

  • cd ~
  • mkdir dir1
  • mkdir dir2
  • touch dir1/file{1..100}

Ahora tenemos un directorio llamado dir1 con 100 archivos vacíos en él.

  • ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90file10 file19 file28 file37 file46 file55 file64 file73 file82 file91file100 file2 file29 file38 file47 file56 file65 file74 file83 file92file11 file20 file3 file39 file48 file57 file66 file75 file84 file93file12 file21 file30 file4 file49 file58 file67 file76 file85 file94file13 file22 file31 file40 file5 file59 file68 file77 file86 file95file14 file23 file32 file41 file50 file6 file69 file78 file87 file96file15 file24 file33 file42 file51 file60 file7 file79 file88 file97file16 file25 file34 file43 file52 file61 file70 file8 file89 file98file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

También tenemos un directorio vacío llamado dir2.

Para sincronizar el contenido de dir1 con dir2 en el mismo sistema, escriba:

  • rsync -r dir1/ dir2

La opción -r significa recursiva, lo cual es necesario para la sincronización de directorios.

También podríamos utilizar la bandera -a en su lugar:

  • rsync -a dir1/ dir2

La opción -a es una bandera combinada. Significa «archivo» y se sincroniza recursivamente y preserva los enlaces simbólicos, los archivos especiales y de dispositivo, las horas de modificación, el grupo, el propietario y los permisos. Se utiliza con más frecuencia que -r y suele ser lo que se quiere utilizar.

Una nota importante

Puede que se haya dado cuenta de que hay una barra diagonal final (/) al final del primer argumento en los comandos anteriores:

  • rsync -a dir1/ dir2

Esto es necesario para significar «el contenido de dir1«. La alternativa, sin la barra diagonal final, colocaría dir1, incluyendo el directorio, dentro de dir2. Esto crearía una jerarquía que se parece a:

  • ~/dir2/dir1/

Siempre verifique dos veces sus argumentos antes de ejecutar un comando rsync. Rsync proporciona un método para hacer esto pasando las opciones -n o --dry-run. La bandera -v (para verbosidad) también es necesaria para obtener la salida apropiada:

  • rsync -anv dir1/ dir2
Output
sending incremental file list./file1file10file100file11file12file13file14file15file16file17file18. . .

Compare esta salida con la que obtenemos cuando eliminamos la barra final:

  • rsync -anv dir1 dir2
Output
sending incremental file listdir1/dir1/file1dir1/file10dir1/file100dir1/file11dir1/file12dir1/file13dir1/file14dir1/file15dir1/file16dir1/file17dir1/file18. . .

Puede ver aquí que el directorio en sí se transfiere.

Cómo usar Rsync para sincronizar con un sistema remoto

Sincronizar con un sistema remoto es trivial si tienes acceso SSH a la máquina remota y rsync instalado en ambos lados. Una vez que haya verificado el acceso SSH entre las dos máquinas, puede sincronizar la carpeta dir1 desde antes a un equipo remoto utilizando esta sintaxis (tenga en cuenta que queremos transferir el directorio real en este caso, por lo que omitimos la barra diagonal final):

  • rsync -a ~/dir1 username@remote_host:destination_directory

Esto se llama una operación «push» porque empuja un directorio desde el sistema local a un sistema remoto. La operación opuesta es «pull». Se utiliza para sincronizar un directorio remoto con el sistema local. Si el dir1 estuviera en el sistema remoto en lugar de nuestro sistema local, la sintaxis sería:

  • rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

Al igual que cp y otras herramientas similares, el origen es siempre el primer argumento, y el destino es siempre el segundo.

Opciones útiles para Rsync

Rsync proporciona muchas opciones para alterar el comportamiento por defecto de la utilidad. Ya hemos hablado de algunas de las banderas más necesarias.

Si está transfiriendo archivos que aún no han sido comprimidos, como archivos de texto, puede reducir la transferencia de red añadiendo compresión con la opción -z:

  • rsync -az source destination

La bandera -P es muy útil. Combina las banderas --progress y --partial. El primero de ellos le da una barra de progreso para las transferencias y el segundo le permite reanudar las transferencias interrumpidas:

  • rsync -azP source destination
Output
sending incremental file list./file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)file100 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)file11 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101). . .

Si ejecutamos el comando de nuevo, obtendremos una salida más corta, porque no se han hecho cambios. Esto ilustra la capacidad de rsync de utilizar los tiempos de modificación para determinar si se han realizado cambios.

  • rsync -azP source destination
Output
sending incremental file listsent 818 bytes received 12 bytes 1660.00 bytes/sectotal size is 0 speedup is 0.00

Podemos actualizar el tiempo de modificación de algunos de los archivos y ver que rsync vuelve a copiar de forma inteligente sólo los archivos modificados:

  • touch dir1/file{1..10}
  • rsync -azP source destination
Output
sending incremental file listfile1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101). . .

Para mantener dos directorios realmente sincronizados, es necesario eliminar los archivos del directorio de destino si se eliminan del origen. Por defecto, rsync no elimina nada del directorio de destino.

Podemos cambiar este comportamiento con la opción --delete. Antes de usar esta opción, utilice la opción --dry-run y haga pruebas para evitar la pérdida de datos:

  • rsync -a --delete source destination

Si deseamos excluir ciertos archivos o directorios ubicados dentro de un directorio que estamos sincronizando, podemos hacerlo especificándolos en una lista separada por comas a continuación de la opción --exclude=:

  • rsync -a --exclude=pattern_to_exclude source destination

Si hemos especificado un patrón para excluir, podemos anular esa exclusión para los archivos que coincidan con un patrón diferente utilizando la opción --include=.

  • rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

Por último, la opción --backup de rsync se puede utilizar para almacenar copias de seguridad de archivos importantes. Se utiliza junto con la opción --backup-dir, que especifica el directorio donde se deben almacenar los archivos de copia de seguridad.

  • rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

Conclusión

Rsync puede simplificar las transferencias de archivos a través de conexiones en red y añadir robustez a la sincronización de directorios locales. La flexibilidad de rsync lo convierte en una buena opción para muchas operaciones diferentes a nivel de archivos.

El dominio de rsync permite diseñar operaciones de copia de seguridad complejas y obtener un control detallado sobre lo que se transfiere y cómo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.