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

Posted on Oct 22, 2020 – Updated on Oct 22, 2020 - by Franco

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.

La sincronización con rsync 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:

 -v, --verbose               incrementa la verbosidad
 -q, --quiet                 suprime los errores que puedan presentarse
 -a, --archive               modo archivar; equivalente a usar -rlptgoD (no -H)
 -r, --recursive             usar modo recursivo, es decir recorrer dentro de directorios/carpetas
 -R, --relative              usar el nombre de rutas relativo
 -b, --backup                hacer un backup (respaldo) de los archivos a reemplazar (ver --suffix & --backup-dir)
     --backup-dir=DIR        hacer backups (respaldos) basándose en una jerarquía definida en DIR
     --suffix=SUFFIX         usar un sufijo para el backup (default ~ w/o --backup-dir)
 -u, --update                saltar archivos que son más nuevos en el directorio de destino que el de origen
 -d, --dirs                  transferir directorios de manera no recursiva
 -l, --links                 copiar symlinks (enlaces simbólicos) como symlinks
 -p, --perms                 conservar permisos locales
     --executability         conservar la ejecutabilidad de los programas
 -o, --owner                 conservar dueño (solo para super-user)
 -g, --group                 conservar grupo
 -n, --dry-run               mostrar que se hubiese transferido (es para hacer pruebas)
 -e, --rsh=COMMAND           especificar que shell usar (por lo general SSH)
     --existing              saltar crear files nuevos en el receptor
     --ignore-existing       saltar actualizar files existentes en el receptor
     --remove-source-files   el remitente (el que envía) borra los files de origen al finalizar 
     												 (como si los estuviera moviendo realmente)
     --force                 forzar eliminar directorios aún así no estén vacíos
     --max-delete=NUM        no borrar más de NUM archivos
     --max-size=SIZE         no transferir ningún archivo (de tamaño) superior a SIZE
     --min-size=SIZE         no transferir ningún archivo (de tamaño) inferior SIZE
 -z, --compress              comprimir los datos a transferir
     --exclude=PATTERN       no incluir los archivos y directorios que coincidan con PATTERN
     --include=PATTERN       incluir los archivos que coincidan con PATTERN
		 --stats                 mostrar estadísticas de la transferencia.
 -h, --human-readable        imprimir los archivos de manera fácil de leer
     --progress              mostrar el progreso de la transferencia
 -P                          lo mismo que utilizar la opción --partial y la opción --progress

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

apt-get install rsync

Fedora/CentOS

yum install rsync

MacOS

brew install rsync

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

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Ejemplo práctico

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

Duplicar folder

cd ~ 		# nos coloca en la carpeta home del usuario actual
mkdir original	 # creamos una carpeta llamada "original"
mkdir duplicados # creamos una carpeta llamada "duplicados"
touch original/file{1..3} # creamos 3 archivos "file1, file2 y file3" en la carpeta original
ls -l original  # nos lista los 3 archivos creados dentro de la carpeta "original"

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

rsync original/* duplicado/

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

rm -rf {original,duplicados}

Luego ejecutamos los siguientes comandos:

cd ~ 
mkdir {original,duplicados}	
mkdir original/folder{1..10}
touch original/folder{1..10}/file{1..3}{.txt,.jpg,.bat}	 #1
tree {original,duplicados}         #2

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:

original
├── folder1
│   ├── file1.bat
│   ├── file1.jpg
│   ├── file1.txt
│   ├── file2.bat
│   ├── file2.jpg
│   ├── file2.txt
│   ├── file3.bat
│   ├── file3.jpg
│   └── file3.txt
...

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:

duplicados
├── folder1
│   ├── file1.jpg
│   ├── file2.jpg
│   └── file3.jpg
├── folder10
│   ├── file1.jpg
│   ├── file2.jpg
│   └── file3.jpg
...

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:

rsync -vzhP post-rsync.md blog@wemake.pe:/ruta/del/blog/posts/

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:

rsync -vzh post-rsync.md blog@192.168.0.1:/ruta/del/blog/posts/

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:

rsync -vzh -u posts/*.md blog@wemake.pe:/ruta/del/blog/posts/

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:

rsync -vazh blog@wemake.pe:/ruta/del/blog/posts/* ~/blog/

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:

rsync -vazh --backup --backup-dir=~/backups blog@wemake.pe:/ruta/del/blog/posts/* ~/blog/ 

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: