Mi Blog
👉 Cómo sincronizar directorios con Rsync

Cómo sincronizar directorios con Rsync

 
(6 votos)

Sincronizar varios directorios es una tarea sencilla con rsync. Rsync permite realizar copias de directorios de forma exacta, sencilla y ahorrando acho de banda. Olvídate de estar copiando y borrando los directorios, con rsync podrás tener los directorios que quieras sincronizados a la perfección entre ellos.

Seguid leyendo y os enseñaré los primeros pasos para comenzar a utilizar rsync...

⬇️ Compra en Amazon el hardware que utilizo ⬇️

🔥 ¡DESCÚBRELOS! 🔥

 

 

¿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!


Acerca de Mi

RPF

Soy Ingeniero Téc. Industrial Mecánico, Administrador de Sistemas Informáticos, Desarrollador de Aplicaciones Informaticas Web, Técnico Superior en PRL, Experto en Energías Renovables... y trabajo actualmente como Senior DevOPS en HP SCDS.

Contactar conmigo

Dirección: León, España

E-Mail: Contactar

Web: https://www.raulprietofernandez.net

Skype: raul.lnx

APÚNTATE GRATIS

VIP RPF
Entra en la Comunidad VIP y consigue acceso a las descargas en PDF, Trucos y Videotutoriales ocultos y mucho más... ¡Muy Pronto!
Cookies

Usamos cookies en nuestro sitio web. Algunas de ellas son esenciales para el funcionamiento del sitio, mientras que otras nos ayudan a mejorar el sitio web y también la experiencia del usuario (cookies de rastreo). Puedes decidir por ti mismo si quieres permitir el uso de las cookies. Ten en cuenta que si las rechazas, puede que no puedas usar todas las funcionalidades del sitio web.