Copyright © 2005-2019 LinuxTotal.com.mx
Se concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation.
rsync
es la herramienta de copiado y sincronización de archivos más potente que existe en el mundo de Linux/Unix.
Es una utilería, que de acuerdo a su página man
, es rápida, versatil para el copiado local y remoto de archivos. Ofrece una
larga lista de opciones que controlan todos los posibles aspectos de su comportamiento.
El 'secreto' de rsync
es su algoritmo llamado 'delta-transfer' que reduce la cantidad de datos que se envían vía red
al enviar solo las diferencias que hay entre dos archivos a nivel de sus metadatos (permisos, fechas de acceso, etc) y del contenido
de sus datos a nivel de bloques en disco.
El modo de uso de rsync
es idéntica a los comandos cp
o scp
, es decir,
rsync [opciones] origen [destino]
El 'destino' en rsync se dice que es opcional porque si solo se usa el origen, entonces equivale a listar el directorio o archivo origen.
Tanto el 'origen' como el 'destino' pueden ser locales o remotos
Para poder ejemplificar el uso básico de rsync
se crean un par de directorios y algo de contenido:
$> mkdir dir1 dir2 $> touch dir1/reporte{1..5} $> $> ls -l dir1/ total 0 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:43 reporte1 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:43 reporte2 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:43 reporte3 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:43 reporte4 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:43 reporte5 $> $> ls -l dir2/ total 0 $>
Usando mkdir
creamos un par de directorios y después con touch
generamos 5 archivos llamados reporte1, reporte2, etc.
rsync
para sincronizar directorios requiere de al menos la opción -r que indicar recursividad y copia el contenido
del directorio más todos los subdirectorios que se encuentren el directorio.
$> rsync -r dir1/ dir2 $> ls -l dir2/ total 0 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:45 reporte1 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:45 reporte2 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:45 reporte3 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:45 reporte4 -rw-rw-r-- 1 user1 user1 0 Jan 9 13:45 reporte5 $>
Si por alguna razón no se requiere recursividad pero si crear los subdirectorios (y no copiar su contenido) entonces utiliza la opción --dirs que solo copia el contenido del directorio origen, archivos y nombre de directorios, pero no hay recursividad.
NOTA: Si se utilizan las opciones -r y --dirs al mismo tiempo, entonces -r tiene preferencia.
Cuando se sincronizan directorios es importante tomar en cuenta la diagonal / (slash) al final del directorio (dir1) origen ya que esto indica 'copiar el contendio del dir1' y sus subdirectorios directamente en dir2.
De lo contrario el resultado es el siguiente:
$ rsync -r dir1 dir2 $ $ ls -l dir2/ total 4 drwxrwxr-x 2 user user 4096 Jan 9 13:46 dir1
Hay que tomar en cuenta que -r solo copia recursivamente pero no preserva o conserva permisos y estampas de tiempo de los archivos copiados.
rsync
es similar en uso que el comando cp
veamos las opciones más utilizadas:
$ rsync -vazh dir1/ dir2
$ rsync -avzh file* dir2 sending incremental file list file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 sent 56.73K bytes received 206 bytes 22.77K bytes/sec total size is 57.67M speedup is 1,012.97 $ rsync -az file* dir2 $
Como su nombre lo indica rsync
"remote sync" es utilizado principalmente para copiar desde y hacía servidores remotos entre si, la sintaxis es sencilla: se indica el hostname o dirección IP del servidor remoto seguidio de : y el directorio destino (host:dir)
Ejamplos:
[user1@host1]$ rsync -avzh /srv/respaldos/ host2:respaldos/ $ rsync -avzh /srv/respaldos/ user1@host2:respaldos/ $ rsync -avzhP admin@192.168.10.10:/srv/respaldos/ /home/sergio/respaldos/
Si estás copiando información sensible y quieres asegurarte que esta sea transferida de manera segura (encriptada) se puede entonces utilizar la opción -e con el parámetro ssh.
$ rsync -avzhe ssh admin@10.0.0.100:/backups/file001.log /var/log/. admin@10.0.0.100's password: receiving incremental file list file001.log sent 70 bytes received 9.23K bytes 2.17K bytes/sec total size is 50.12K speedup is 2.66
Estas dos opciones, --include y --exclude realizan exactamente lo que indican incluir y/o excluir archivos en la transferencia de archivos.
$ rsync -azP --exclude '*.bkp' 192.168.10.10:/srv/respaldos/ /home/sergio/respaldos/ $ rsync -azP --include 'reporte*' --exclude '*' 192.168.10.10:/srv/respaldos/ /home/sergio/respaldos/
No es algo muy frecuente, pero supongamos que deseas mantener dos directorios completamente iguales, los mismos archivos, es decir, que el directorio destino sea idéntico al directorio origen. Tienes entonces uno o mas archivos que existen en el destino pero que ya no están en el origen, al utilizar rsync
con la opción --delete lo logras. Se eliminarán los archivos que estén en el destino que ya no existan en el origen.
$ touch dir2/ejemplo.txt $ rsync -avhP --delete dir1/ dir2 sending incremental file list deleting ejemplo.txt ./ reporte1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) reporte2 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=3/6) reporte3 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=2/6) reporte4 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=1/6) reporte5 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=0/6) sent 337 bytes received 129 bytes 932.00 bytes/sec total size is 0 speedup is 0.00
Si después de una transferencia o copia de datos exitosa no deseas ocupar más espacio en el origen, entonces utiliza la opción --remove-source-files, que como su nombre lo indica claramente eliminará los archivos en el origen. ¡¡¡CUIDADO CON ESTA OPCIÓN!!! (Checa la siguiente opción)
$ touch dir1/test1.txt dir1/test2.txt $ rsync -avh --remove-source-files dir1/test* dir2/ sending incremental file list test1.txt test2.txt sent 167 bytes received 70 bytes 474.00 bytes/sec total size is 0 speedup is 0.00 $ $ ll dir1/test* ls: cannot access dir1/test*: No such file or directory $
Cuando realices copias o transferencias críticas, donde al sobreescribir o eliminar archivos pudiera causar consecuencias graves, como la pérdida de datos o archivos sensibles (como en las opciones mostradas anteriormente --remove-source-files y --delete) o si aun no estás muy familiarizado con el uso de rsync
, entonces es conveniente utilizar la muy útil opción --dry-run (simular o probar) donde rsync
realmente no realizará ninguna acción de transferencia, copiado o eliminado de archivos, pero sin embargo te mostrará la salida como si lo hubiera hecjo, y de esta manera puedas comprobar si las acciones son las realmente deseadas. Una vez satisfecho solo elimina --dry-run y ejecuta el comando.
$ rsync -avh --dry-run --remove-source-files dir1/test* dir2/
--max-size='500k' esta opción permite definir el tamaño máximo de los archivos a transferir. Asi que solo se copiaran los archivos iguales o menores al tamaño indicado.
--min-size='500k' esta opción permite definir el tamaño mínimo de los archivos a transferir. Asi que solo se copiaran los archivos iguales o mayores al tamaño indicado.
$ rsync -avzhP -e ssh --max-size='500k' /home/ventas/reportes/*.xls root@172.16.0.50:/backups/ root@172.16.0.50's password: sending incremental file list 201501.xls 201502.xls 201505.xls ... sent 234.14K bytes received 315 bytes 22.21K bytes/sec total size is 11.07M speedup is 175.82
--bwlimit=100 por default, rsync
no limita el ancho de banda en las transferencias entre equipos, pero si se desea limitarla con esta opción se logra.
$ rsync -avzhP -e ssh --max-size='500k' --bwlimit=100 /home/ventas/reportes/*.xls root@172.16.0.50:/backups/
Las opciones más comunes o útiles de rsync
, ya sea de uso local o remoto son las siguientes:
Opción | Descripción | |
---|---|---|
Corta | Larga | |
-a | --archive | Modo archive, es igual a indicar las opciones r,l,p,t,g,o y D |
-r | --recursive | Recursivo, copia recursivamente los directorios. |
-l | --links | Cuando encuentra symlinks (enlaces simbólicos), estos son recreados en el destino. |
-p | --perms | Opción que causa en el destino establecer los permisos igual que en el origen. |
-t | --times | Transfiere los tiempos de los archivos (atime, ctime, mtime) al destino |
-g | --group | Establece en el destino que el grupo del archivo copiado sea igual que el origen. |
-o | --owner | Establece en el destino que el propietario del archivo copiado sea igual que el origen. |
-D | Esto es igual que indicar las opciones --devices y --specials | |
--exclude PATTERN | Excluye archivos que igualan el patrón o pattern indicado. | |
--include PATTERN | Incluye archivos que igualan el patrón o pattern indicado. | |
--devices | Transfiere archivos de dispositivos de bloque y caracter al destino donde son recreados. Esto solo puede suceder si en el destino se tienen permisos de root. | |
--specials | Transfiere archivos especiales como fifos y named sockets. | |
--version | Indica el número de versión de rsync |
|
-v | --verbose | Incrementa la cantidad de información que se informa durante la transferencia o copia de archivos. Es la opción contraria a --quiet |
-q | --quiet | Decremente la cantidad de información que se informa durante la transferecnia o copia de archivos.
Generalmente se utiliza cuando rsync se utiliza en una tarea cron. Es la opción contraria a --verbose |
-I | --ignore-times | Una de las grandes virtudes de rsync es que al momento de copiar o transferir archivos, si estos son iguales
en el destino en términos de tiempos y tamaño ya no lo copia, no hay cambios. Esta opción permite que esto sea ignorado y todos
los archivos serán copiados/actualizados en el destino. (ver --size-only también) |
--size-only | Normalmente solo se transfieren archivos con los tiempos cambiados o el tamaño cambiado. Con esta opción se ignoran los tiempos de los archivos y se transfiere cualquiera con un tamaño distinto en el destino. | |
-n | --dry-run | Crea una prueba de test de lo que realmente ocurrirá sin esta opción, sin realizar ningún cambio. Es decir, la salida mostrada será muy similar a lo que realmente pasará si no se incluye --dry-run. Generalmente se usa junto con la opción --verbose y la opción --itemize-changes |
-i | --itemize-changes | Reporta una lista de los cambios realizados en cada archivo, incluidos cambios en sus atributos. Esto es equivalente a
utilizar -vv en versiones obsolteas de rsync . |
--remove-source-files | Remueve los archivos en el origen (no directorios) si en el destino estos fueron exitosamente duplicados o copiados. | |
--timeout=TIEMPO | Especifica un timeout en segundos, si no datos son transferidos en tiempo indicado rsync terminará.
El default es 0 segundos que quiere decir sin timeout. |
|
--log-file=ARCHIVO | Bitacoriza lo que se ha realizado en el ARCHIVO indicado. | |
--stats | Imprime un conjunto informativo de datos estadísticos sobre la transferencia realizada. | |
--progress | Muestra el avance o progreso de los archivos que están siendo transferidos. | |
--bwlimit=KBPS | Permite establecer un límite de transferencia en kilobytes por segundo. Esta opción su default es 0, lo que indica no límite en el uso del ancho de banda en la transferencia. | |
--max-size=TAMAÑO | No transfiere cualquier archivo más grande que el TAMAÑO indicado. | |
--min-size=TAMAÑO | No transfiere cualquier archivo más pequeño que el TAMAÑO indicado. | |
-z | --compress | Comprimir datos durante la transferencia. |
Si encuentras útil la información que proveé LinuxTotal, considera realizar un donativo que estimule a seguir proporcionando contenido de calidad y utilidad. Gracias.
Dona a través de paypal::
O a través de bitcoins:
Archivos como el de configuración de samba /etc/samba/smb.conf suelen tener comentarios que explican o detallan la variable a con....
El editor en línea (stream editor) sed es un editor de texto en línea que realiza operaciones de edición sobre datos provenient....
Observa la imagen siguiente, que corresponde a uno de los sitios de descargas de MySQL y notarás que todos los archivos que puede....
Ya no es nada raro que un centro de cómputo o en un site se encuentren varios sistemas Linux actuando como servidores de archivos....
En este tutorial sobre listas de control de acceso en squid, aprenderás lo básico de como configurarlas y establecerlas en la co....
La siguiente combinación de comandos te permite extraer los 10 comandos más usados directamente del historial (comando history) ....
Cuando usas rm para eliminar o borrar un archivo, lo que realmente sucede es que los datos del archivo, su información tal cual, ....
Hay distintas maneras de establecer cuanto tiempo un sistema Linux lleva ejecutándose o prendido. Conócelas en este tutorial.....
Hay ocasiones que los usuarios insisten en poner contraseñas muy débiles de 5 o 6 caracteres a lo más. Y el argumento que dan e....
Hay ocasiones que cuando busco un archivo dentro del listado de un directorio con varios archivos, usando ls, deseo ver solamente ....