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 para minimizar la cantidad de datos copiados moviendo solo las partes de los archivos que han cambiado.

En este tutorial, definiremos Rsync, revisaremos la sintaxis al usar rsync, explicaremos cómo usar Rsync para sincronizar con un sistema remoto y otras opciones disponibles para usted.

Implemente sus aplicaciones frontend desde GitHub usando Plataforma de Aplicaciones de DigitalOcean. Deje que DigitalOcean se encargue de escalar su aplicación.

Prerrequisitos

Para practicar el uso de rsync para sincronizar archivos entre un sistema local y remoto, necesitará dos máquinas para actuar como su computadora local y su máquina remota, respectivamente. Estas dos máquinas podrían ser servidores virtuales privados, máquinas virtuales, contenedores o computadoras personales, siempre y cuando estén configuradas correctamente.

Si planea seguir esta guía utilizando servidores, sería prudente configurarlos con usuarios administrativos y configurar un firewall en cada uno de ellos. Para configurar estos servidores, siga nuestra Guía de Configuración Inicial del Servidor.

Independientemente de qué tipos de máquinas utilice para seguir este tutorial, necesitará haber creado claves SSH en ambos. Luego, copie la clave pública de cada servidor al archivo authorized_keys del otro servidor como se describe en Paso 2 de esa guía.

Esta guía fue validada en máquinas que ejecutan Ubuntu 20.04, aunque debería funcionar en general con cualquier computadora que ejecute un sistema operativo basado en Linux y tenga rsync instalado.

Definición de Rsync

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

Entendiendo la Sintaxis de Rsync

La sintaxis para rsync opera de manera similar a otras herramientas, como ssh, scp y cp.

Primero, cambie al directorio de inicio ejecutando el siguiente comando:

  1. cd ~

Luego, cree un directorio de prueba:

  1. mkdir dir1

Cree otro directorio de prueba:

  1. mkdir dir2

Ahora agregue algunos archivos de prueba:

  1. touch dir1/file{1..100}

Ahora hay un directorio llamado dir1 con 100 archivos vacíos en él. Confirme enumerando los archivos:

  1. ls dir1
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 tiene un directorio vacío llamado dir2. Para sincronizar el contenido de dir1 con dir2 en el mismo sistema, ejecutará rsync y usará la bandera -r, que significa “recursivo” y es necesario para la sincronización de directorios:

  1. rsync -r dir1/ dir2

Otra opción es usar la bandera -a, que es una combinación de banderas y significa “archivo”. Esta bandera sincroniza de forma recursiva y conserva enlaces simbólicos, archivos especiales y de dispositivo, tiempos de modificación, grupos, propietarios y permisos. Se usa más comúnmente que -r y es la bandera recomendada para usar. Ejecute el mismo comando que el ejemplo anterior, esta vez usando la bandera -a:

  1. rsync -a dir1/ dir2

Tenga en cuenta que hay una barra diagonal al final del primer argumento en la sintaxis de los dos comandos anteriores y resaltada aquí:

  1. rsync -a dir1/ dir2

Esta barra diagonal final significa el contenido de dir1. Sin la barra diagonal final, dir1, incluido el directorio, se colocaría dentro de dir2. El resultado crearía una jerarquía como la siguiente:

~/dir2/dir1/[files]

Otro consejo es verificar dos veces tus 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, que significa “verboso”, también es necesaria para obtener la salida apropiada. Combinarás las banderas a, n, y v en el siguiente comando:

  1. rsync -anv dir1/ dir2
Output
sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .

Ahora compara esa salida con la que recibes al eliminar la barra diagonal al final, como en el siguiente:

  1. rsync -anv dir1 dir2
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 . . .

Esta salida ahora demuestra que el directorio mismo fue transferido, en lugar de solo los archivos dentro del directorio.

Usando Rsync para Sincronizar con un Sistema Remoto

Para usar rsync para sincronizar con un sistema remoto, solo necesitas tener configurado el acceso SSH entre tu máquina local y remota, así como tener rsync instalado en ambos sistemas. Una vez que tengas verificado el acceso SSH entre las dos máquinas, puedes sincronizar la carpeta dir1 de la sección anterior a una máquina remota usando la siguiente sintaxis. Por favor nota en este caso, que deseas transferir el directorio real, así que omitirás la barra diagonal al final:

  1. rsync -a ~/dir1 username@remote_host:destination_directory

Este proceso se llama una operación de push porque “empuja” un directorio desde el sistema local a un sistema remoto. La operación opuesta es pull, y se utiliza para sincronizar un directorio remoto con el sistema local. Si el directorio dir1 estuviera en el sistema remoto en lugar de en su sistema local, la sintaxis sería la siguiente:

  1. rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

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

Uso de Otras Opciones de Rsync

Rsync proporciona muchas opciones para alterar el comportamiento predeterminado de la utilidad, como las opciones de bandera que aprendió en la sección anterior.

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

  1. rsync -az source destination

La bandera -P también es útil. Combina las banderas --progress y --partial. Esta primera bandera proporciona una barra de progreso para las transferencias, y la segunda bandera le permite reanudar las transferencias interrumpidas:

  1. rsync -azP source destination
Output
sending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .

Si ejecuta el comando nuevamente, recibirá una salida abreviada 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
Output
sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00

Supongamos que actualizara la hora de modificación en algunos de los archivos con un comando como el siguiente:

  1. touch dir1/file{1..10}

Entonces, si ejecutas rsync con -azP nuevamente, notarás en la salida cómo Rsync inteligentemente vuelve a copiar solo los archivos modificados:

  1. 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) 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 archivos del directorio de destino si se eliminan del origen. Por defecto, rsync no elimina nada del directorio de destino.

Puedes cambiar este comportamiento con la opción --delete. Antes de usar esta opción, puedes usar -n, la opción --dry-run, para realizar una prueba y evitar pérdida de datos no deseada:

  1. rsync -an --delete source destination

Si prefieres excluir ciertos archivos o directorios ubicados dentro de un directorio que estás 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 tienes un patrón especificado para excluir, puedes 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 de Rsync se puede utilizar para almacenar copias de seguridad de archivos importantes. Se utiliza en conjunto con la opción --backup-dir, que especifica el directorio donde se deben almacenar los archivos de copia de seguridad:

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

Conclusión

Rsync puede optimizar las transferencias de archivos sobre conexiones de 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 diferentes a nivel de archivos.

A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories