Introducción
Rsync, significa “sincronización remota”, es una herramienta de sincronización remota y local de archivos. Utiliza un algoritmo que minimiza la cantidad de datos copiados al mover solo las porciones de archivos que han cambiado.
En esta guía, cubriremos el uso básico de esta poderosa utilidad. Usaremos un Ubuntu VPS en los ejemplos, pero puedes usar cualquier distribución moderna de Linux para seguir el tutorial.
¿Qué es Rsync?
Rsync es una herramienta de sincronización habilitada para red muy flexible. Se puede también referirse al protocolo de red desarrollado para utilizar esta herramienta. Cuando hacemos referencia a rsync en esta guía, nos referimos principalmente a la utilidad, y no al protocolo.
Debido a su ubicuidad en Linux y sistemas similares a Unix y 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 rsync es 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:
1 2 3 4 |
cd ~ mkdir dir1 mkdir dir2 touch dir1/file{1..100} |
Ahora tenemos un directorio llamado dir1 con 100 archivos vacíos en él.
1 |
ls dir1 |
1 2 3 4 5 6 7 8 9 10 11 |
Output file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99 |
También tenemos un directorio vacío llamado dir2.
Para sincronizar los contenidos de dir1 a dir2 en el mismo sistema, debes escribir:
1 |
rsync -r dir1/ dir2 |
La opción -r significa recursiva, que es necesaria para la sincronización de directorios.
También podríamos usar el indicador -a en su lugar:
1 |
rsync -a dir1/ dir2 |
La opción -a es un indicador de combinación. Significa “archivo”, se sincroniza recursivamente y conserva enlaces simbólicos, archivos especiales y de dispositivos, tiempos de modificación, grupo, propietario y permisos. Es más comúnmente usado que -r y usualmente es lo que quieres usar.
Una nota importante
Es posible que hayas notado que hay una barra inclinada (/) al final del primer argumento en los comandos anteriores:
1 |
$ rsync -a dir1/ dir2 |
Esto es necesario para indicar “los contenidos de dir1“. La alternativa, sin la barra diagonal final, incluiría dir1, incluido el directorio, dentro dir2. Esto crearía una jerarquía que se parece a lo siguiente:
1 |
~/dir2/dir1/[files] |
Siempre debes verificar dos veces tus argumentos antes de ejecutar un comando rsync. Rsync proporciona un método para hacerlo pasando las opciones -n o –dry-run. El indicador -v (para ver más detalles) también es necesario para obtener el resultado apropiado:
1 |
rsync -anv dir1/ dir2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Output sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . . |
Debes comparar esta salida con la salida que obtenemos cuando eliminamos la barra inclinada al final:
1 |
rsync -anv dir1 dir2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Output sending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . . |
Puedes ver aquí que el directorio en sí se transfiere.
Cómo usar Rsync para sincronizar con un sistema remoto
La sincronización con un sistema remoto es trivial si tiene sacceso SSH a la máquina remota y rsync instalado en ambos lados. Si necesitas configurar claves SSH, has clic aquí.
Una vez que hayas verificado el acceso SSH entre las dos máquinas, puedes sincronizar la carpeta dir1 de una computadora anterior a la remota mediante el uso de esta sintaxis (ten en cuenta que queremos transferir el directorio real en este caso, por lo que omitiremos la barra diagonal):
1 |
$ rsync -a ~/dir1 username@remote_host:destination_directory |
Esto se denomina operación “push” porque empuja un directorio del sistema local a un sistema remoto. La operación opuesta es “pull”. Se utiliza para sincronizar un directorio remoto con el sistema local. Si dir1 estuvieran en el sistema remoto en lugar de nuestro sistema local, la sintaxis sería:
1 |
$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine |
Como cp y herramientas similares, la fuente siempre es el primer argumento y el destino siempre es el segundo.
Opciones útiles para Rsync
Rsync proporciona muchas opciones para alterar el comportamiento predeterminado de la utilidad. Ya hemos discutido algunas de los indicadores más necesarios.
Si estás transfiriendo archivos que aún no se han comprimido, como los archivos de texto, puedes reducir la transferencia de red agregando compresión con la opción -z:
1 |
$ rsync -az source destination |
El indicador -P es muy útil. Combina los indicadores –progress y –partial. El primero de ellos te da una barra de progreso para las transferencias y el segundo le permite reanudar las transferencias interrumpidas:
1 |
$ rsync -azP source destination |
1 2 3 4 5 6 7 8 9 10 11 |
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 nuevamente, obtendremos una salida más corta, ya que no se han realizado cambios. Esto ilustra la capacidad de rsync para usar los tiempos de modificación para determinar si se han realizado cambios.
1 |
$ rsync -azP source destination |
1 2 3 4 |
Output sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00 |
Podemos actualizar el tiempo de modificación en algunos de los archivos y ver que rsync copia de forma inteligente solo los archivos modificados:
1 2 |
touch dir1/file{1..10} rsync -azP source destination |
1 2 3 4 5 6 7 8 9 10 11 |
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) 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 verdaderamente sincronizados, es necesario eliminar los archivos del directorio de destino si se eliminan del origen. De forma predeterminada, rsync no elimina nada del directorio de destino.
Podemos cambiar este comportamiento con la opción –delete. Antes de usar esta opción, usa la opción –dry-run y realiza pruebas para evitar la pérdida de datos:
1 |
$ rsync -a --delete source destination |
Si deseas excluir ciertos archivos o directorios ubicados dentro de un directorio que está sincronizando, puedes hacerlo especificándolos en una lista separada por comas después de la opción –exclude =:
1 |
$ rsync -a --exclude=pattern_to_exclude source destination |
Si hemos especificado un patrón para excluir, podemos anular esa exclusión para archivos que coincidan con un patrón diferente usando la opción –include = :
1 |
$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination |
Finalmente, la opción –backup rsync se puede usar para almacenar copias de seguridad de archivos importantes. Se la utilizas junto con la opción –backup-dir, este especifica el directorio donde se deben almacenar los archivos de respaldo.
1 |
$ 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 agregar robustez a la sincronización de directorios locales. La flexibilidad de rsync lo convierte en una buena opción para muchas operaciones de nivel de archivo diferentes.
Un dominio de rsync te permite diseñar operaciones de copia de seguridad complejas y obtener un control preciso sobre lo que se transfiere y cómo se transfiere.