Posted on Jan 1, 0001

Tutorial: Rsync (sincronizar archivos entre carpetas y entre computadoras)

El comando rsync (Remote Sync, o en español “sincronización remota”) de Linux sirve para transferir y sincronizar directorios y archivos entre computadoras. La sincronización puede ser entre dos carpetas locales, dos computadoras locales o incluso con servidores remotos. Cabe destacar que esta sincronización es muy rápida y muy eficiente gracias a que este programa usa un algoritmo muy veloz de ‘diferenciamiento’.

Sintaxis básica

La sintaxis del comando es bastante similar a los comandos mv y cp que puedes ya haber usado en el pasado.

rsync [modificadores opcionales] [origen] [destino]

Argumentos

Los parámetros de origen y destino son las carpetas o archivos de origen y de destino respectivamente.

En el caso de hacer una transferencia remota, es decir fuera de la computadora donde se ejecuta el comando tendríamos que incluir el usuario y el “host” de la computadora remota. Por ejemplo, si la computadora de destino está en un usuario “admin” y la dirección IP (host) de la computadora es 192.168.1.5 entonces el destino sería admin@192.168.1.5:/ruta/de/destino. Noten el uso de los dos puntos : como delimitador.

Opciones y argumentos principales:

Algunos de las opciones disponibles incluyen:

Para ver todas las opciones que tenemos disponibles podemos usar el comando man o con el modificador --help

Usando Rsync

Instalación

La buena noticia es que ya viene instalado en la gran mayoría de distribuciones de Linux y otros sistemas basados en Unix. Para verificar si tenemos rsync instalado podemos usar el comando rsync --version en la línea de comandos. Si lo tenemos instalado debería imprimirnos algo como lo siguiente:

rsync version 2.6.9 protocol version 29

En caso no lo tengas instalado, puedes instalarlo de la siguiente manera según tu S.O:

Debian/Ubuntu

Fedora/CentOS

MacOS

Si no tienes brew tendrás que instalarlo con el siguiente script y luego correr el comando anterior:

Ejemplo práctico

Para este tutorial vamos a primero crear una estructura de carpetas con los siguientes comandos:

Duplicar folder

Ahora vamos a sincronizar los directorios original y duplicado para que contengan los mismos archivos con el comando:

El asterisco (*) indica que copie todos los archivos dentro de original hacia la carpeta duplicado. Ahora si usamos el comando ls -l duplicado/ vamos a ver que ambas carpetas tienen la misma información, es decir los archivos “file1, file2 y file3”

Duplicar archivos solo con cierta extensión

Ahora haremos algo un poco más complicado, crearemos una estructura de carpetas algo más elaborada y copiaremos solo los archivos con la extensión .jpg

Primero vamos borrar las carpetas que hemos creado anteriormente con el comando rm

Luego ejecutamos los siguientes comandos:

En #1 crea creamos 3 archivos con tres extensiones distintas dentro de cada carpeta y en #2 nos imprime la estructura de carpetas que acabamos de crear.

Deberíamos ver algo como lo siguiente:

Aquí vemos que hemos creado dentro de cada carpeta los 3 archivos con extensiones distintas.

Ahora nos vamos a apoyar de las opciones -v de verboso, -r de recursivo, -h de “human readable”,-z para comprimir los datos mientras se transfieren,--exclude para excluir los archivos que no queremos sincronizar, y, finalmente, --include para incluir los archivos .jpg. Entonces nuestro comando para copiar solo los archivos que tengan la extensión .jpg ahora es:

rsync -v -r -h -z --include="*/" --include=""*.jpg" --exclude="*"" original/ duplicados/

N.B.: Si deseas puedes juntar las opciones en un solo bloque como -hvrz como para no escribir tanto.

Para verificar que todo se ha transferido correctamente podemos usar el comando tree duplicados y nos debería aparecer lo siguiente:

Opción --dry-run

Si queremos hacer una previsualización de lo que fuéramos a copiar podemos usar la opción -n (o en versión larga --dry-run) como para probar que nuestro comando va a hacer lo que queremos. Esto es de mucha ayuda en especial con directorios remotos, y queremos estar seguros que vamos a transferir los archivos correctamente. Por ejemplo, usando el último comando:

rsync -v -r -h -z --dry-run --include="*/" --include=""*.jpg" --exclude="*"" original/ duplicados/

Nos listará los archivos que vamos a copiar. Si es correcto lo que nos imprime, procedemos a correr el mismo comando sin la opción --dry-run.

Sincronizar con un servidor remoto

Digamos que queremos sincronizar los mismos archivos, pero ahora con un servidor o una computadora en nuestra LAN. Para hacer esto necesitamos tres cosas, el usuario con el cual vamos a acceder, la IP o dominio y los permisos en la computadora de destino (o servidor).

Por ejemplo, yo quiero subir este mismo archivo que estoy escribiendo llamado post-rsync.md al servidor con dominio wemake.pe con el usuario blog entonces mi comando sería:

Así de sencillo. Estamos usando la opción -P para que nos dé un progreso de lo que está sucediendo, nos sirve por ejemplo si son archivos grandes los que vamos a actualizar.

N.B.: Si no tienes aún un dominio o quieres transmitirlo a una dirección IP local podrías usar algo como:

Sincronizar sólo los archivos modificados con un servidor remoto

Muchas veces, hago correcciones en algunos posts, y no tomo nota de cuales he sincronizado y cuales no, así que dejo que rsync se encargue de hacerlo. Para empezar, todos mis posts los archivo en una carpeta llamada /blog en mi computadora. Entonces lo que hago es simplemente decirle al rsync con la opción -u que solamente sincronice los archivos locales que tengan fecha de modificación más reciente, es decir solo los que he modificado. Por ejemplo:

Recuperar archivos del servidor en una carpeta local

Si queremos, por ejemplo, recuperar todos los archivos que tenemos en una carpeta del servidor, rsync también nos puede ayudar. Digamos que quiero obtener los posts que tengo almacenados en /ruta/del/blog/posts en mi servidor remoto de wemake.pe usaría el siguiente comando:

Lo único que he hecho es decir que la carpeta de origen es mi carpeta en el servidor remoto y la de destino es mi carpeta local en ~/posts/

Hacer un backup (respaldo) de los archivos que se van a reemplazar del servidor

También podemos usar rsync para no perder los archivos que sobrescribimos durante las transferencias. Las opciones para hacerlo son --backup y --backup-dir.

Por ejemplo, el comando anterior con las opciones de backup seria el siguiente comando:

Esto copiaría los files que se sobrescriban o modifiquen hacia la carpeta especificada en --backup-dir

Algunas otras opciones que pueden servirte

--delete Esta opción te permite eliminar todos los archivos que estén la carpeta de destino y que no están en la carpeta original, es decir para que sean exactamente iguales.

--max-size=10k esta opción tiene como parámetro el tamaño máximo del archivo a transmitir, si el tamaño de un archivo es superior a este valor, no se sincronizará.

Conclusión

Si bien es cierto un solo post no alcanza para explicar todas las opciones que te brinda rsync espero que este tutorial haya sido de ayuda para empezar a utilizarlo. Como ven, es muy útil para transferir y sincronizar cualquier tipo de carpetas y archivos. Es una utilidad muy rápida y las opciones son muy poderosas. Puedes ver la documentación oficial para conocer más de esta herramienta.

Fuentes y lecturas recomendadas:

https://www.hostinger.es/tutoriales/rsync-linux/

https://blog.infranetworking.com/rsync-algunos-ejemplos-practicos-de-su-uso/

https://www.comoinstalarlinux.com/rsync-local-remoto-archivos-backup-files-commands/

https://www.comoinstalarlinux.com/comandos-linux-rsync/

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