rsync «remote sync»
Rsync «Remote Sync» (Sincronización Remota) es una herramienta omnipresente en sistemas Linux, rápida y versátil que nos permite la copia y sincronización de nuestros ficheros localmente y de forma remota, pudiendo hacerlo entre diferentes directorios, discos, e incluso entre diferentes equipos en red. Admite ssh, lo que nos permite la transferencia de datos con cualquier servidor remoto. Vamos a ver algunos ejemplos de uso básico y avanzado del comando Rsync. Necesitaremos ser root o tener privilegios de sudo.
Sumario
- Consideraciones previas
- Sintaxis y opciones de rsync
- Sincronizar ficheros y directorios localmente
- Copiar/sincronizar un fichero o directorio localmente en otro directorio
- Copiar/sincronizar archivos y directorios en equipo remoto
- Copias seguras con rsync y ssh
- Incluir o excluir ficheros o directorios
- Eliminación de ficheros en el destino
- Hacer pruebas con el comando sin que aplique los cambios
Consideraciones previas
Rsync sincroniza eficientemente ficheros y directorios. Podríamos utilizar el comando cp o scp, pero rsync es más rápido al hacer copias incrementales de estos y no los ficheros completos. Además podemos aplicar compresión y descompresión de los ficheros en ambos extremos, consumiendo menos ancho de banda.
Sería extraño que tu distribución Linux no tuviera instalada la herramienta, pero si es así, es sencilla de instalar
apt-get update #para actualizar la lista de paquetes de los repositorios apt-get install rsync #para instalar la herramienta
Sintaxis y opciones de rsync
El modo de uso de rsync es idéntica a los comandos cp o scp, es decir,
rsync [opciones] origen [destino]
Para ver todas las opciones consulta «man rsync» en tu terminal, aquí vemos las más comunes:
- -v: (verbose) muestra el progreso de la transferencia.
- -h: (human readable) muestra la salida numérica en un formato comprensible.
- -r: (recursive) copia los datos de forma recursiva, pero no conserva las fechas ni los permisos de los datos de origen.
- -a: (archive mode) copia los datos de forma recursiva, y además preserva los enlaces simbólicos, los propietarios, los permisos y las fechas de los datos de origen.
- -z: (compress) comprime los datos durante la transferencia de los mismos.
- -o: (Owner) preserva el propietarios.
- -g: (group) preserva el grupo.
- -P: (progress) nos muestra el progreso de la trasnferencia de datos
- -i: (itemize-changes) genera un resumen de cambios para todas las actualizaciones
- –stats: nos da algunas estadísticas de la transferencia de ficheros
Sincronizar ficheros y directorios localmente
Si queremos hacer una sincronización de un directorio, con otro de nuestro sistema, para hacer una copia incremental, ejecutamos el comando como sigue. La primera copia será completa y las sucesivas solo copiará los ficheros modificados.
mkdir Directorio1 Copia_Directorio1 touch Directorio1/fichero{1..6}

Para sincronizar directorios, rsync, necesita, al menos la opción «-r», que indica recursividad. Esta acción copiará el contenido del directorio y de todos los subdirectorios que se encuentren el directorio. No obstante lo normal, como veremos es utilizar las opciones «-vazh» en vez de «-r».
sudo rsync -r Directorio1/ Copia_Directorio1 ls -l Copia_Directorio1/

Hay que tener muy presente la barra «/» o «slash» al final del directorio de origen, para copiar el contenido del directorio y no el mismo diretorio. Si lo hiciésemos así, el resultado sería que nos copiaría Directorio1 en Copia_Directorio1 y no su contenido, quedando: Copia_Directorio1/Directorio1/*.
Añadimos un fichero a Directorio1 y sincronizamos los directorios.
echo "Estamos añadiendo un fichero para probar la sincronización" > Directorio1/Nuevofich sudo rsync -vazhi --stats Directorio1/ Copia_Directorio1

Lo verificamos
ls -l Copia_Directorio1/

Estamos trabajando dentro de un directorio. Si lo que queremos es guardar la copia en otro directorio lo hacemos haciendo uso de las rutas absolutas o relativas. Veamos el ejemplo anterior.
Copiar/sincronizar un archivo o directorio localmente en otro directorio
Para copiar el fichero localmente en otro directorio tenemos que hacer uso de las rutas absolutas o relativas, según nos convenga. Con el siguiente comando, copiaremos el fichero «Nuevofich» localmente de un directorio a otro distinto, en este caso «~/Descargas/CopiaFichero». Si el directorio de destino no existe, Rsync lo creará automáticamente. Lo ejecutamos desde el directorio actual.
sudo rsync -zvh Directorio1/Nuevofich ~/Descargas/CopiaFichero

Si lo hiciésemos desde el directorio destino sería
cd Descargas sudo rsync -zvh ~/RutaDirOrigen ./Nuevofich
Para copiar un directorio, lo que tenemos que hacer es modificar las opciones añadiendo la opción «-a», así conseguiremos copiar los datos de forma recursiva, y además preservar los enlaces simbólicos, los propietarios, los permisos y las fechas de los datos de origen.Si ejecutamos el siguiente comando, copiará el /home/Directorio1 en /home/CopiaSeg/.
sudo rsync -avzh Directorio1 /home/CopiaSeg/

Copiar/sincronizar archivos y directorios en equipo remoto
Si queremos guardar la copia a realizar en un equipo remoto, función principal del comando rsync «remote sync», la sintaxis del comando es la siguiente, se indica el hostname o dirección IP del servidor remoto seguido de «:» y el directorio destino (host:dir). Lo vemos con un ejemplo. Tenemos un servidor Ubuntu en la IP 192.168.1.8, que sera el destino remoto de la copia.
sudo rsync -avz ruta_fichero_o_directorio/ usuario@IP:/ruta_destino/
En este caso
sudo rsync -avz /home/javier/Rsync/Directorio1/ javier@192.168.1.8:/home/javier/CopiaSeguridad/

Y vemos, en el servidor Ubuntu, que tenemos «CopiaSeguridad»

Pero también lo podemos hacer a la inversa. Podemos sincronizar un directorio del servidor en el equipo cliente. Te recomiendo utilizar la opción «-P» –progress, ya que es muy útil en transferencias de múltiples ficheros para visualizar el progreso de la transferencia.
sudo rsync -avzhP usuario@IP:ruta_dir_servidor ruta_equipo_cliente
En este caso
sudo rsync -avzhP javier@192.168.1.15:/home/javier/Rsync/Directorio1/ /home/javier/CopiaSeguridad

Con esta última opción, podemos restaurar la copia del servidor en el cliente.
Copias seguras con rsync y ssh
Si queremos realizar una copia segura, podemos utilizar ssh. Este protocolo nos permite encriptar los datos a transferir con la opción «-e». Puedes ver como se instala y configura ssh en este enlace. La sintaxis es la siguiente
sudo rsync -avzheP ssh ruta_directorio_origen/ usuariot@IP:ruta_directorio_destino/
En este caso sería
sudo rsync -avzheP ssh /home/Directorio1/ usuario@IP:/home/CopiaSeguridad/
SSH utiliza, por defecto el puerto 22, pero si nos tenemos que conectar a un puerto distinto, por configuración en el servidor, lo podemos especificar en el comando con la opción «-p» tras el comando ssh. Sería
sudo rsync -avzh -e 'ssh -p <numerodepuerto>' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/
Incluir o excluir ficheros o directorios
Con las opciones «–include» y «–exclude» indicamos qué ficheros o directorios deseamos incluir o excluir en la transferencia de datos. Por ejemplo, le decimos a rsync que incluya sólo los archivos y directorios cuyo nombre comience por «F», y que excluya el resto de archivos y directorios. Del servidor al cliente
sudo rsync -avze ssh --include 'F*' --exclude '*' usuario@IP:ruta_directorio_origen/ ruta_directorio_destino/
Y del cliente al servidor
sudo rsync -avze ssh --include 'F*' --exclude '*' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/
Si queremos copiar solo los ficheros con un peso concreto, usamos la opción «–max-size». Por ejemplo, solo copiamos los ficheros que tengan un tamaño de hasta 500k.
sudo rsync -avzhe ssh --max-size='500k' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/
Todas estas opciones están disponibles para su uso en local sin ssh.
Eliminación de ficheros en el destino
Si lo que queremos es tener dos directorios completamente iguales con los mismos ficheros, es decir, que el directorio destino sea idéntico al directorio origen, y tenemos uno o mas ficheros, que existen en el destino, pero que ya no están en el origen, tenemos que utilizar la opción de rsync «–delete». Se eliminarán los ficheros que estén en el destino que ya no existan en el origen. Vemos el contenido de los dos directorios. Primero creamos otro nuevo en Directorio1
touch Directorio1/ejemplo.txt

rsync -avhP --delete Directorio1/ CopiaSeguridad/CopiaSeguridad

Borramos en Directorio1 el fichero ejemplo.txt y podemos ver que al copiar todo de Directorio1 a CopiaSeguridad, en CopiaSeguridad se elimina ejemplo.txt al no existir en Directorio1. Con la opción «-P» muestra el progreso de la transferencia fichero por fichero.

Eliminación de ficheros en el origen
Si después de haber completado una transferencia o copia de datos, no necesitamos guardar esos datos en el origen, para liberar espacio, utilizamos la opción «–remove-source-files», que eliminará los ficheros en el origen. ¡¡¡CUIDADO: ESTA OPCIÓN ES MUY PELIGROSA!!!
touch Directorio1/prueba1.txt Directorio1/prueba2.txt sudo rsync --remove-source-files -azvhe Directorio1/prueba* Directorio2/

Y en remoto
sudo rsync --remove-source-files -azvhe ssh ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/
Hacer pruebas con el comando sin que aplique los cambios
Al realizar transferencias críticas, donde sobreescribimos o borramos datos, podemos provocar la pérdida de estos. Por ello, si no estamos muy familiarizados con el uso del comando, podemos utilizar la opción «-dry-run», y rsync no realizará ninguna acción de transferencia, copiado o eliminado de ficheros, pero sí nos mostrará la salida como si lo hubiera hecho. Una vez asegurado que las acciones a realizar son las que buscamos, solo tendremos que borrar la opción «-dry-run» y volver a ejecutar el comando.
sudo rsync -azvh --dry-run --remove-source-files Dir1/prueba* Dir2/
Y en remoto
sudo rsync --dry-run --remove-source-files -azvhe ssh ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/
Si lo vas a hacer en un servidor remoto, hazlo con ssh para securizar la transferencia. Si lo estas probando, con un servidor en local, puedes prescindir de ssh.
Forzar una transferencia completa en vez de sólo los cambios
Por defecto, rsync sólo realiza una copia completa de los archivos la primera vez, luego simplemente copia incrementalmente los bloques y bytes que han cambiado desde la sincronización completa. Si necesitamos forzar que se realice una sincronización completa, tenemos que usar la opicón «–W»
En el servidor Ubuntu tenemos

Y en el cliente Debian

Hacemos la sincronización completa del servidor al cliente
sudo rsync -zvhWe usuario@IP:ruta_directorio_origen/ ruta_directorio_destino/
En este caso será
sudo rsync -zvhWe javier@192.168.1.8:/home/javier/CopiaSeguridad/ /home/javier/Rsync/Directorio1/

Y del cliente al servidor lo hacemos como sigue
sudo rsync -zvhWe ruta_directorio_origen/* usuario@IP:ruta_directorio_destino/
En nuestro caso
sudo rsync -zvhWe /home/javier/Rsync/Directorio1/* javier@192.168.1.8:/home/javier/CopiaSeguridad/

Vemos que en el servidor ha añadido el fichero prueba1.txt

El comando tiene muchas más opciones que puedes consultar ejecutando «man rsync». Y con esto ya podemos copiar, borrar y mover ficheros y directorios de una forma segura y rápida.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.
Buen trabajo Javier. Es muy de agradecer tu esfuerzo
Gracias Barto por tu visita e interés.