¿QUÉ ES RSYNC?
rsync es una aplicación libre para sistemas de tipo Unix/Linux y Microsoft Windows que ofrece transmisión eficiente de datos incrementales, que opera también con datos comprimidos y cifrados. Mediante una técnica de delta encoding, permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos ubicaciones en una misma máquina, minimizando el volumen de datos transferidos. Una característica importante de rsync no encontrada en la mayoría de programas o protocolos es que la copia toma lugar con sólo una transmisión en cada dirección. rsync puede copiar o mostrar directorios contenidos y copia de archivos, opcionalmente usando compresión y recursión.
rsync se distribuye bajo la licencia GNU General Public License.
rcync permite sincronizar directorios remotos ahorrando ancho de banda
1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL
- Un PC con cualquier distribución de GNU/Linux
- Conexión a Internet (recomendado)
2.- INSTALAR RSYNC
En función de la distribución utilizada, la instalación de rsync se realizará de una u otra forma. Por ejemplo para distribuciones basadas en GNU/Linux Debian y en GNU/Linux Red Hat, la instalación se realizará de la siguiente forma:
Distribuciones basadas en Debian:
sudo apt-get update
sudo apt-get install rsync
Distribuciones basadas en Red Hat:
sudo yum -y update
raul@redhat:~$ sudo yum install rsync
Si usas otra distribución, busca como instalar el paquete con el gestor de paquetes de tu distribución, seguramente sea muy similar a los ejemplos arriba mencionados.
3.- DIRECTORIO INICIAL
Para comenzar, partiremos de un directorio llamado "dir1" con una estructura sencilla de ficheros y directorios. Para ver toda la estructura podemos usar comandos como "tree" o "find":
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
4.- COPIAR ARCHIVOS Y CARPETAS CON RSYNC
Para copiar los contenidos desde un directorio a otro, reemplazando todos los archivos y subdirectorios del directorio destino hay que utilizar:
rsync -rtv directorio_origen/ directorio_destino/
Debemos tener en cuenta la / diagonal final que se añade en el directorio_origen/. Lo que se consigue con esta barra es evitar que se cree un nuevo directorio. Si no agregamos dicha barra / en el directorio origen, entonces se creará el directorio_origen dentro del directorio_destino.
Por ejemplo, si queremos copiar todo el contenido de un directorio llamado Fotos dentro de un directorio Fotos que ya existe previamente, se necesita agregar la barra / diagonal al final, si no lo hacemos, se creará un directorio llamado Fotos dentro del directorio destino llamada Fotos.
Por ejemplo, para copiar todos los ficheros y subdirectorios del directorio "dir1" en otro directorio llamado "dir2" utilizaremos el siguiente comando:
rsync -rtv dir1/ dir2/
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
Para comprobar que todo ha sido copiado correctamente, podemos utilizar el comando "find":
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
./dir2
./dir2/dir11
./dir2/dir11/file11.txt
./dir2/dir11/file12.txt
./dir2/file1.txt
./dir2/file2.txt
También podemos utilizar el comando "diff" para encontrar las diferencias entre directorios:
diff -r dir1/ dir2/
5.- SINCRONIZAR DOS DIRECTORIOS (SOLO ACTUALIZAR)
Si lo que necesitamos es actualizar el contenido del directorio_destino, es decir, añadir los ficheros nuevos que hay en el directorio_origen copiarlos al directorio_destino, debemos utilizar el parámetro -u. Gracias a éste parámetro, se actualizará el contenido del directorio_destino en función del directorio_origen. Rsync utiliza el algoritmo llamado delta-transfer para realizar dicha operación.
En este ejemplo vamos a ver como funciona el algoritmo. Dentro del directorio ./dir1/ se ha creado un nuevo fichero llamado file3.txt. A la hora de "sincronizar" los directorios únicamente el nuevo fichero file3.txt será transferido:
La estructura de los directorios es la siguiente:
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
./dir1/file3.txt
./dir2
./dir2/dir11
./dir2/dir11/file11.txt
./dir2/dir11/file12.txt
./dir2/file1.txt
./dir2/file2.txt
Para actualizar el contenido del directorio utilizaremos el siguiente comando:
rsync -rtvu carpeta_origen/ carpeta_destino/
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
- El parámetro -u significa que se actualizarán solamente los ficheros y directorios diferentes entre el directorio_origen y el directorio_destino
Para actualizar el contenido del directorio ./dir1/ en ./dir2/ utilizaremos el siguiente comando, donde se ve que únicamente el fichero file3.txt será transferido:
rsync -rtvu dir1/ dir2/
sending incremental file list
./
file3.txt
sent 248 bytes received 39 bytes 574.00 bytes/sec
total size is 0 speedup is 0.00
La nueva estructura de directorios ahora es la siguiente:
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
./dir1/file3.txt
./dir2
./dir2/dir11
./dir2/dir11/file11.txt
./dir2/dir11/file12.txt
./dir2/file1.txt
./dir2/file2.txt
./dir2/file3.txt
Debemos tener en cuenta que, por defecto, rsync utiliza para diferenciar los ficheros del directorio_origen y directorios_destino tanto el tamaño de los ficheros como su fecha de modificación. Si lo que queremos hacer es utilizar un hash en los ficheros , debemos utilizar el parámetro -c. Con el parámetro -c se consigue que: si el checksum del origen y el destino son iguales, no se realizará ninguna operación sobre dicho fichero. El comando a utilizar sería en este caso el siguiente:
rsync -rvuc directorio_origen/ directorio_destino/
6.- SINCRONIZAR COMPLETAMENTE DOS DIRECTORIOS
Si lo que estamos buscando es la sincronización 100% entre dos directorios, es decir, que sean iguales entre ellos, se necesitan copiar los ficheros y directorios desde el directorio_origen hasta el directorio_destino, pero se deben borrar en el directorio_destino los ficheros y directorios borrados en el directorio_origen.
rsync permite realizar todo esto gracias al parámetro --delete. El parámetro --delete utilizado junto al parámetro -u, actualiza los archivos modificados y nos permite mantener dos directorios sincronizados a la perfección.
rsync -rtvu --delete carpeta_origen/ carpeta_destino/
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
- El parámetro -u significa que se actualizarán solamente los ficheros y directorios diferentes entre el directorio_origen y el directorio_destino
- El parámetro --delete significa que borrarán del directorio_destino los ficheros que no existan en el directorio_origen
La estructura de directorios es la siguiente, donde se puede ver que en el directorio_destino existe el fichero file3.txt pero en el origen no:
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
./dir2
./dir2/dir11
./dir2/dir11/file11.txt
./dir2/dir11/file12.txt
./dir2/file1.txt
./dir2/file2.txt
./dir2/file3.txt
Si sincronizamos 100% los directorios, se puede ver como se borra el fichero file3.txt del directorio_destino ya que en el directorio_origen dicho fichero no existe:
rsync -rtvu --delete dir1/ dir2/
sending incremental file list
deleting file3.txt
./
sent 177 bytes received 29 bytes 412.00 bytes/sec
total size is 0 speedup is 0.00
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
- El parámetro -u significa que se actualizarán solamente los ficheros y directorios diferentes entre el directorio_origen y el directorio_destino
- El parámetro --delete significa que borrarán del directorio_destino los ficheros que no existan en el directorio_origen
La nueva estructura de directorios es la siguiente. El fichero file3.txt no existe en ninguno de los dos directorios:
find
.
./dir1
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir11
./dir1/dir11/file11.txt
./dir1/dir11/file12.txt
./dir2
./dir2/dir11
./dir2/dir11/file11.txt
./dir2/dir11/file12.txt
./dir2/file1.txt
./dir2/file2.txt
El proceso de borrado de ficheros se puede realizar en momentos diferentes de la sincronización:
- Antes de la transferencia: rsync puede buscar los archivos faltantes y borrarlos antes de de el proceso de transferencia con el parámetro --delete-after (comportamiento por defecto)
- Después de la transferencia: rsync puede buscar los archivos faltantes y borrarlos después que la transferencia se ha completado con el parámetro --delete-after
- Durante la transferencia: rsync puede borrar los archivos durante la transferencia con el parámetro --delete-during
- Borrado retrasado: rsync puede hacer la transferencia y encontrar los archivos faltantes durante este proceso, esperar hasta que ha terminado y borrar los archivos que encontró después, con el parámetro --delete-delay
7.- SINCRONIZAR DOS DIRECTORIOS REMOTOS
Con rsync también es posible copiar archivos y sincronizar un directorio local con otro directorio remoto ubicado en cualquier otro equipo de la red siempre que se tenga acceso SSH, RSH o que esté ejecutando rsync como un servicio en el servidor remoto.
Para sincronizar dos directorios, uno de ellos ubicado en un equipo remoto, se necesita la dirección DNS o dirección IP del equipo remoto, así como un usuario con privilegios de acceso.
Por ejemplo, para sincronizar un directorio_local con un directorio_remoto, se pueden usar las siguientes formas:
- rsync -rtvz directorio_origen/ usuario@dominio:/ruta/directorio_destino/
- rsync -rtvz directorio_origen/ Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo./ruta/directorio_destino/
rsync -rtvz directorio_origen/ usuario@dominio:/ruta/directorio_destino/
rsync -rtvz directorio_origen/ Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo./ruta/directorio_destino/
Por ejemplo, para sincronizar un directorio_remoto con un directorio_local, se pueden usar las siguientes formas:
rsync -rtvz usuario@dominio:/ruta/directorio_origen/ directorio_destino/
rsync -rtvz Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo./ruta/directorio_origen/ directorio_destino/
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
- El parámetro -z significa que se comprimirán los ficheros antes de enviarse
8.- COMPRIMIR ARCHIVOS ANTES DE SINCRONIZAR
A la hora de realizar transferencias entre equipos diferentes, quizás nos interese ahorrar algo de ancho de banda comprimiendo los ficheros antes de ser enviados. Para ello, deberemos añadir el parámetro -z. Por ejemplo:
rsync -rtvz directorio_origen/ usuario@dominio:/directorio_destino/
- El parámetro -r significa que el copiado se realizará de forma recursiva, es decir, se copiarán todos los directorios, subdirectorios y ficheros almacenados en todos ellos.
- El parámetro -t provocará que el tiempo de modificación de cada fichero sea el mismo tanto en el directorio_origen como en el directorio_destino.
- El parámetro -v significa que se mostrará más información durante el proceso de sincronización y así ver el progreso del comando.
- El parámetro -z significa que se comprimirán los ficheros antes de enviarse
Hay que tener en cuenta que la compresión de ficheros requiere de mucha CPU, por ello, cuando los ficheros a transferir son muy grandes o los ficheros ya están en un formato comprimido, la opción del parámetro -z no es muy interesante.
9.- EXCLUIR FICHEROS Y DIRECTORIOS
En ciertas ocasiones nos veremos obligados a excluir algunos ficheros o directorios. Para ello, podemos hacer uso del parámetro --exclude seguido del fichero o directorio que queremos excluir. Por ejemplo:
Excluir un directorio:
rsync -rtvz --exclude 'directorio' directorio_origen/ directorio_destino/
Excluir un fichero:
rsync -rtvz --exclude 'fichero.doc' directorio_origen/ directorio_destino/
Excluir un subdirectorio:
rsync -rtvz --exclude 'ruta/directorio' directorio_origen/ directorio_destino/
Excluir un fichero en un subdirectorio:
rsync -rtvz --exclude 'ruta/directorio/fichero.doc' directorio_origen/ directorio_destino/
Si queremos excluir muchos ficheros, en diferentes rutas, podemos crear un fichero con la lista de todos ellos (uno en cada línea) y pasarlo como parámetro como en el siguiente ejemplo:
rsync -rtv --exclude-from 'lista_excluidos.txt' directorio_origen/ directorio_destino/
ENJOY!