rsync: ejemplos de sincronización de archivos y copias de seguridad en Linux
rsync copia y sincroniza archivos en local y por SSH transfiriendo solo los cambios. El comando base es rsync -avz origen/ usuario@host:/ruta/: -a conserva permisos y fechas, -v muestra los archivos, -z comprime el tráfico; --delete hace que el destino sea una copia exacta del origen, y -n permite comprobar el resultado antes sin cambiar nada.
rsync es la herramienta estándar de Linux para copiar y sincronizar archivos: en local, entre discos y entre servidores por SSH. Su principal diferencia con cp y scp es que solo transfiere lo que ha cambiado, así que volver a sincronizar un directorio grande tarda segundos. A continuación tiene ejemplos de rsync para las tareas habituales: subir un proyecto a un servidor, crear un espejo de un directorio, excluir archivos, hacer copias de seguridad con instantáneas y programarlas.
Sintaxis y las opciones que más se usan
La forma general del comando es:
rsync [opciones] ORIGEN... DESTINO
El origen y el destino pueden ser rutas locales o remotas con la forma usuario@host:/ruta. Uno de los dos extremos debe ser local: rsync no copia directamente entre dos máquinas remotas.
| Opción | Qué hace |
|---|---|
-a | modo archivo: recursivo, conservando permisos, propietario, grupo, fecha de modificación y enlaces simbólicos (equivale a -rlptgoD) |
-v | mostrar la lista de archivos transferidos |
-z | comprimir los datos durante la transferencia por red |
-h | tamaños legibles (K, M, G) |
-P | equivale a --partial --progress: progreso y reanudación de archivos interrumpidos |
-n, --dry-run | simulacro: muestra lo que se haría, sin cambiar nada |
--delete | borrar en el destino los archivos que no existen en el origen |
--exclude | no copiar archivos que coincidan con un patrón |
-e | indicar el shell remoto, por ejemplo -e "ssh -p 2222" |
-H, -A, -X | conservar enlaces duros, ACL y atributos extendidos (no están incluidos en -a) |
En la práctica, en nueve de cada diez casos basta con rsync -avh en local y rsync -avzh por red.
La barra al final de la ruta: la trampa principal
El error más común de quien empieza está en la barra final del origen. De ella depende si se copia el directorio en sí o solo su contenido.
# Copiar el DIRECTORIO project dentro de /backup → queda /backup/project/...
rsync -av project /backup/
# Copiar el CONTENIDO de project en /backup → los archivos quedan directamente en /backup/
rsync -av project/ /backup/
Fácil de recordar: la barra al final del origen significa «el contenido de este directorio». En el destino la barra no cambia nada. Si tiene dudas, añada -n y revise qué rutas pretende crear rsync.
Copia local
Copiar un directorio a un disco externo mostrando el progreso:
rsync -avhP ~/photos/ /mnt/usb/photos/
Si repite el mismo comando, no vuelve a copiarlo todo: rsync compara el tamaño y la fecha de modificación de los archivos y transfiere solo los nuevos y los modificados. Al final, la salida indica cuántos datos se han enviado realmente:
sending incremental file list
2026/10/IMG_2041.jpg
4.12M 100% 38.40MB/s 0:00:00 (xfr#1, to-chk=0/1534)
sent 4.13M bytes received 9.25K bytes 2.76M bytes/sec
total size is 6.82G speedup is 1,648.21
El valor speedup indica cuántas veces se han transferido menos datos que en una copia completa.
rsync por SSH: copiar al servidor y de vuelta
Para rutas remotas rsync usa SSH por defecto, así que no hay que configurar nada aparte: basta con que funcione el acceso normal por ssh. Lo más cómodo es usar claves: así no se pide la contraseña y el comando se puede programar en cron.
# Subir el sitio al servidor
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/
# Descargar los registros del servidor a mi equipo
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/
# SSH en un puerto no estándar y con una clave concreta
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/
rsync debe estar instalado en ambas máquinas, porque en el extremo remoto se ejecuta a través de SSH. Si no está, verá rsync: command not found: instale el paquete (sudo apt install rsync o sudo dnf install rsync).
Si el host está definido en ~/.ssh/config con un alias, rsync lo entiende: rsync -avz ./site/ prod:/var/www/site/.
Se necesitan permisos de root en el servidor
Cuando los archivos del destino pertenecen a root y usted entra con un usuario normal, puede ejecutar el rsync remoto con sudo:
rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/
Para que funcione, en el servidor sudo debe permitir ejecutar rsync sin contraseña (una regla en sudoers); si no, el comando se quedará esperando una entrada.
Espejo de un directorio: --delete
Por defecto rsync solo añade y actualiza archivos, pero no borra nada. Para que el destino sea una copia exacta del origen hace falta --delete:
rsync -avh --delete ~/projects/ /mnt/backup/projects/
Es una opción potente y peligrosa. Un error en la ruta (por ejemplo, un origen vacío o una barra olvidada) puede borrar datos en el destino. Por eso hay una regla: cualquier comando con --delete se ejecuta primero con -n.
$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py
sent 1.20K bytes received 64 bytes 2.53K bytes/sec
total size is 18.4M speedup is 14,554.39 (DRY RUN)
Las líneas deleting muestran lo que se va a borrar. Cuando compruebe que todo es correcto, ejecute el comando sin -n.
Variantes útiles: --delete-after borra los archivos después de la transferencia (el destino está completo durante más tiempo), y --backup --backup-dir=/mnt/backup/deleted-$(date +%F) no borra, sino que mueve los archivos eliminados o reemplazados a un directorio aparte.
Exclusiones: --exclude e --include
Excluir archivos temporales, dependencias y secretos es una práctica habitual en despliegues y copias de seguridad.
# Varios patrones
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/
# Patrones desde un archivo
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/
El archivo .rsyncignore es una lista simple de patrones, uno por línea:
.git/
node_modules/
*.log
.env
tmp/
Cómo funcionan los patrones:
- Un patrón sin barra al principio (
*.log) coincide a cualquier profundidad. - Un patrón con barra al principio (
/tmp/) está anclado a la raíz de la transferencia: excluye solo eltmpde primer nivel. - La barra al final (
cache/) significa «solo directorios». - Las reglas se evalúan en orden, y se aplica la primera que coincida.
De este último punto se deduce un truco para «copiar solo lo necesario»: primero permitir lo que interesa y después prohibir el resto.
# Copiar solo los archivos .conf manteniendo la estructura de directorios
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/
Aquí --include='*/' es necesario para que rsync entre en todos los subdirectorios. Añada --prune-empty-dirs (-m) para no crear carpetas vacías.
Copias de seguridad con rsync
Copia diaria sencilla
Una copia mínima del directorio personal en un segundo disco:
rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/
El inconveniente de este método es que solo se guarda una versión. Si alguien estropea un archivo y la copia se sincroniza antes de que se note, la versión anterior se pierde.
Instantáneas incrementales con --link-dest
La opción --link-dest resuelve este problema casi sin coste de espacio. Los archivos sin cambios no se copian, sino que se crean como enlaces duros a los archivos de la instantánea anterior. Cada instantánea parece una copia completa, pero solo ocupan espacio los cambios.
#!/bin/bash
set -euo pipefail
SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"
mkdir -p "$DEST"
rsync -aH --delete \
--exclude='.cache/' \
--link-dest="$DEST/latest" \
"$SRC" "$DEST/$TODAY"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
En la primera ejecución todavía no existe latest: rsync mostrará una advertencia y hará una copia completa, y es normal. Las instantáneas antiguas se borran con un simple rm -rf: los archivos a los que apuntan otras instantáneas no desaparecerán.
Para borrar las instantáneas de más de 30 días:
find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +
Copia de seguridad de un servidor en otra máquina
Conviene elegir la dirección «del servidor de copias al de trabajo»: la máquina de backup recoge los datos por sí misma, y el servidor de trabajo no tiene acceso a las copias. Si lo hackean, las copias seguirán intactas.
rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
backup@web01:/var/www/ /srv/backups/web01/www/
Tenga en cuenta que las bases de datos no se pueden copiar así: los archivos de un SGBD en funcionamiento no están consistentes durante la copia. Primero haga un volcado (mysqldump, pg_dump) y deje que rsync transfiera el archivo de volcado ya terminado.
Ejecución programada con cron
El script de copia se añade a cron con crontab -e:
# Todos los días a las 03:15, la salida va al registro
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Qué revisar para que la copia desde cron funcione de verdad:
- El script usa rutas absolutas: cron tiene un
PATHmínimo y otro directorio de trabajo. - La clave SSH no tiene contraseña y el host ya está en
known_hosts; si no, rsync se quedará bloqueado preguntando por la autenticidad de la clave. - El script comprueba el código de salida: rsync devuelve 0 si todo fue bien, 23 si no se transfirió parte de los archivos, y 24 si los archivos desaparecieron durante la copia.
- Para evitar que se ejecuten dos copias a la vez, use
flock:flock -n /tmp/backup.lock /usr/local/bin/backup.sh.
En lugar de cron se puede usar un temporizador de systemd: escribe la salida en el diario y los resultados se consultan cómodamente con journalctl.
Opciones útiles para transferencias grandes
| Tarea | Opción |
|---|---|
| Limitar la velocidad para no saturar el canal | --bwlimit=5M |
| Reanudar un archivo grande tras una interrupción | -P (o --partial) |
| Progreso total en lugar de la lista de archivos | --info=progress2 |
| Comparar por contenido y no por fecha | -c (--checksum), más lento |
| No tocar los archivos que son más nuevos en el destino | -u (--update) |
| No sobrescribir archivos existentes | --ignore-existing |
| Borrar los archivos de origen tras la transferencia (mover) | --remove-source-files |
| Estadísticas detalladas al final | --stats |
Errores habituales y cómo corregirlos
Permission deniedal escribir — el usuario no tiene permisos sobre el directorio de destino. Revise el propietario del directorio o use--rsync-path="sudo rsync".- Los archivos se copian otra vez cada vez — no se conserva la fecha de modificación. Asegúrese de usar
-ao-t; en FAT/exFAT añada--modify-window=2, porque esos sistemas guardan la hora con una precisión de dos segundos. - Errores
chownochgrpal copiar a un pendrive o a una carpeta de red — el sistema de archivos no admite propietarios. Sustituya-apor-rlt. - Aparece un nivel extra
/backup/project/project— se ha confundido la barra final del origen. connection unexpectedly closed— problema con SSH o rsync no instalado en el extremo remoto. Compruebe el acceso normal consshy quersyncesté en el servidor.
Resumen
Para el trabajo diario basta con recordar unos pocos comandos: rsync -avz origen/ host:/destino/ para copiar por SSH, --delete junto con un simulacro previo -n para el espejo, --exclude para lo que sobra y --link-dest para las copias con instantáneas. Preste atención a la barra final del origen y rsync se convertirá en la forma más fiable de trasladar archivos entre máquinas. La sincronización y las copias de seguridad se explican con ejemplos prácticos en el curso de Linux.
Preguntas frecuentes
¿En qué es mejor rsync que scp?
scp copia los archivos completos cada vez, mientras que rsync transfiere solo los cambios, sabe reanudar, puede borrar lo que sobra en el destino y excluir archivos por patrones. Para copiar un único archivo una vez la diferencia es mínima; para la sincronización periódica, rsync es mucho más rápido.
¿Se puede usar rsync en Windows?
Sí, a través de WSL, donde rsync se instala como en cualquier Linux, o mediante Cygwin. Para sincronizar archivos de un equipo Windows con un servidor Linux, lo más cómodo es hacerlo desde WSL.
¿rsync cifra los datos que transfiere?
El propio rsync no cifra, pero al copiar por SSH todo el tráfico viaja por la conexión SSH cifrada. Sin cifrado solo se transfieren datos al trabajar con un demonio rsync mediante una dirección del tipo rsync://.
¿Cómo compruebo que la copia coincide con el original?
Ejecute rsync -avnc origen/ destino/ — con la opción -c los archivos se comparan por sumas de control, y -n no cambia nada. Si la lista de archivos sale vacía, las copias son idénticas.
¿Qué pasa si interrumpo rsync a mitad de la transferencia?
Los archivos ya transferidos se quedan, y el archivo incompleto se borra por defecto. Si vuelve a ejecutar el mismo comando, continuará desde donde se detuvo, y con la opción -P se conservará también la parte del archivo interrumpido.
Este tema se explica a fondo y con práctica en el curso «Linux: с нуля до уверенного администрирования».
Ir al curso