3 – 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.
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:
- 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