Mi Blog

No te olvides seguirme en Facebook.

Tan solo tienes que hacer click en Me Gusta

 

 

x

Cómo sincronizar directorios con Rsync

Cómo sincronizar directorios con Rsync

(Tiempo estimado: 12 - 23 minutos)

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 ⬇️

🔥 HAZ CLICK AHORA 🔥

 

 

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

 

 

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!


⬇️ Compra en Amazon el hardware que utilizo ⬇️

🔥 HAZ CLICK AHORA 🔥
Raúl Prieto Fernández

Sitio Web: raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

No tienes permisos para escribir comentarios. Debes autenticarte con Facebook, Linkedin, Twitter o Google.

LOGIN / ENTRAR

Si haces login, serás automáticamente suscrito a mi lista de Newsletter. Siempre podrás borrarte cuando quieras.

Accesorios Furgonetas Camper: Camper Accesorios

Las Mejores Cafeteras: Las Mejores Cafeteras

⬇️ Compra en Amazon el hardware que utilizo ⬇️

🔥 HAZ CLICK AHORA 🔥