Algunos comandos linux como rsync tienen una cantidad de opciones impresionantes, son muy versátiles pues con el tiempo han agregado formas de usarse, pero se vuelven un tanto complejo. Por eso es bueno poner 10 ejemplos prácticos de como usar rsync para hacer respaldos o copiar directorios con rsync en linux.
10 Ejemplos Prácticos de rsync para Hacer Respaldos
El comando linux rsync es uno de esos comandos que cualquier administrador de sistemas o cualquier usuario Linux debería conocer, es sumamente útil y puede ayudarte en muchas situaciones. Puede que sean demasiadas opciones de las que dispone rsync, pero las mas usadas pueden darnos un buen ejemplo de lo que se puede hacer con este comando y sobre todo como hacerlo.
1 Copiar o Sincronizar Archivos Localmente
Copiar un archivo de una ubicación a otra es una tarea sencilla, pero cuando se tienen que tomar en cuenta permisos, rutas, actualizaciones, y sobre todo tiempo rsync puede ser bastante útil. Para copiar un archivo con rsync puedes usar el siguiente comando
rsync -vh respaldo.tar.gz /tmp/backups/
En este ejemplo se realiza una copia del archivo respaldo.tar.gz dentro del directorio /tmp/backups/ el archivo tendrá el mismo contenido y el mismo tamaño pero será propiedad del usuario que ejecutó el comando y el tiempo de acceso/modificación, además de los permisos, serán los normales que se otorgarían al crear cualquier otro archivo común y corriente.
2 Copiar un Directorio y sus Archivos a un Servidor
Cuando se realiza una copia o sincronización entre equipos remotos siempre es recomendable utilizar la opción -z ya que comprime los archivos enviados o a transferir antes de enviarlos, lo cual reduce el ancho de banda y el tiempo necesarios para completar la transferencia.
Copiar un Archivo a un Equipo Remoto
Es posible copiar los archivos contenidos en un directorio, así como cualquier otro directorio contenidos dentro del primero, esto se realiza mediante el acceso a un equipo de forma remota usando un nombre de usuario y una contraseña.
rsync -avz Documentos root@192.168.0.100:/home/usuario/
Si «Documentos» es un directorio, este se creará dentro del directorio /home/usuario/ que se encuentra en el equipo remoto, este directorio contendrá la misma estructura y archivos que el origen pero estará ubicado en la ruta /home/usuario/Documentos/
Copiar un Directorio de un Equipo Remoto a un Directorio Local
El caso contrario también es posible, solo es necesario indicar la ubicación correspondiente y el directorio local donde se desea copiar el directorio. Por ejemplo
rsync -avz root@192.168.0.100:/home/usuario/Documentos /tmp/Respaldo/
Este comando copiará el Directorio «/home/usuario/Documentos» que está en el servidor con la dirección IP que puedes ver y se realizará una copia del directorio dentro de /tmp/Respaldos/ que está en el equipo local. Aquí se creará un directorio /tmp/Respaldos/Documentos/ aún si no existiera y contendrá los archivos y la estructura de archivos que el directorio remoto.
Copiar un Archivo Mediante ssh
Hay ocasiones en donde se requiere utilizar ssh para realizar la copia o sincronización de archivos/directorios y para pode utilizar rsync de esta forma es necesario utilizar la opción -e, recuerda que puedes ver todos los detalles del comando linux rsync aquí.
Para realizar la copia de un archivo por medio de ssh puedes utilizar este ejemplo:
rsync -avz -e ssh respaldo.tar.gz root@192.168.0.100:/backups/
En esta forma le estás indicando que utilizar un shell externo con la opción «-e» y el shell a usar es «ssh»
4 Mostrar el Progreso al Copiar / Sincronizar
Hay ocasione en las que se requiera copiar archivos que pueden tardar algo de tiempo y en ocasiones es útil saber el progreso que lleva la copia. Para poder tener esta información durante la operación se puede utilizar la opción -P o –partial –progress
rsync -avz -P -e ssh /var/log/httpd/access.log root@192.168.0.100:/backups/
Las opciones en rsync pueden escribirse juntas, salvo que deban incluir algún parámetro como la opción -e, en este caso debería ser la última para poder indicar que será por ssh. El siguiente comando tiene exactamente el mismo resultado que el anterior.
rsync -avzPe ssh /var/log/httpd/access.log root@192.168.0.100:/backups/
Al igual el que los anteriores, el siguiente ejemplo tiene el mismo resultado.
rsync -a -v -z -e ssh --partial --progress /var/log/httpd/access.log root@192.168.0.100:/backups/
5 Sincronizar un directorio entre 2 equipos
Para hacer una sincronización de un directorio entre dos equipos puedes utilizar el comando como si realizaras la copia, solo que en las dos rutas deses asegurarte que se termine con el caracter «/», esto asegurará que el «directorio» origen se sincronice (refiriéndose a su contenido) con el «directorio» destino. Es importante aclarar que los directorios puede llamarse igual o tener distinto nombre, pero los archivos del origen estará en el destino, si han cambiado o si son nuevo, se copiarán al destino.
rsync -avz -e shh /var/www/html/ root@192.168.0.100:/home/web/public_html/
La próxima vez que se ejecute el comando solo copiará los archivos nuevo o que hayan cambiado, si no hay archivos en estas condiciones indicará que se la sincronización se realizó sin cambios. Esto es muy importante por que así puedes tener la seguridad que los dos directorios, el origen y el remoto tiene los mismos archivos.
6 Incluir o Excluir archivos específicos
Otra opción importante para realizar la copia o sincronización de archivos es que se pueden excluir archivos o directorios que tengan algun nombre o elmenteo determinado, por ejemplo evitar que se copiaen los archivos que tengan la extensión .conf, así que serán excluidos.
rsync -avz --exclude "*.conf" /var/www/html/ /home/web/public_html/
Por ejemplo se puede realizar la sincronización solo de los archivos .html excluyendo todos los demás.
rsync -avz --include "*.html" --exclude "*" /var/www/html/ /home/web/public_html/
7 La opción delete al usar rsync
Un aspecto importante al usar rsync es que actualiza diferencias en archivos nuevos o modificados, pero no elimina los archivos que no están en el origen. Si los archivos no existen en el orígen, pero existen en el destino, estos últimos no se eliminan, solo se omiten. Para eliminar esos archivos que no existen en el origen, pero que existen en el destino puedes utilizar una de las varias opciones –delete*, digo varias porque este parametro te permite hacer esta acción antes, después o durante la copia.
Las opciones del comando rsync las puedes ver aquí y todas las que comienzan con «–delete» son las opciones que hay para borrar los archivos en el destino
Para realizar un espejo de un directorio incluso eliminando los archivos que no están en el origen puedes usar este comando
rsync -avz --delete root@192.168.0.100:/var/html/www/ ~/Proyectos/web1/
8 Limitar el tamaño de los archivos enviados
En ocasiones es importante no copiar archivos mayores de cierto tamaño si hay limitaciones en el host destino. Para este caso rsync tiene la opción «–max-size» la cual permite limitar el tamaño de los archivos que se copian y los que exceden ese tamaño se excluyen.
rsync -avz -e ssh --max-size='200k' ~/Documentos/ root@192.168.0.100:/root/tmp/
También existe la opción para excluir los archivos menores a un tamaño de archivo determinado, la opción es «–min-size» y se utiliza de la misma forma.
rsync -avz -e ssh --min-size='3k' ~/Documentos/ root@192.168.0.100:/root/tmp/
9 Eliminar los archivos de origen después de copiar (Mover)
Si, me queda claro que existe el comando mv, para mover archivos, pero cuando requieres tener una certeza que se actualicen los archivos, se borren los archivos que no existen en el origen o cuando ese «mover» archivos se hace entre dos host remotos, rsync es una herramienta invaluable.
Para eliminar los archivos de origen después de copiarlos se utiliza la opción «–remove-source-files», esta opción debe ser usada con precaución ya que los archivos no podrán ser recuparados, no se mueven a una bandeja de reciclaje o algo parecido, simplemente se eliminan del sistema de archivos.
Este ejemplo muestra como se utiliza esta opción:
rsync --remove-source-files -av respaldo.tar.gz /tmp/backups/
10 Hacer una prueba antes de alterar archivos
rsync te permite ejecutar un comando y mostrarte que archivos se borrarían, se copiarían, se actualizarían, etc. Sin realmente modificar nada. Esta opción te permite saber exactamente que ocurrirá sin modificar los archivos en el destino.
Esta opción es «–dry-run» así solo mostrará en pantalla las acciones a realizar, pero sin que estas hayan ocurrido. Esto te permitirá estar seguro(a) de que va a ocurrir con la copia de archivos con rsync antes de hacer alguna acción incorrecta y crear un desastre.
Este es un ejemplo de como utilizar rsync con esta opción:
rsync --remove-source-files -av --dry-run respaldo.tar.gz /tmp/backups/
Espero que se haya gustado este post, rsync es una herramienta muy versátil y todo usuario de Linux, aunque sea solo para una laptop o mas aun si administras equipos, debe conocer este comando ya que te permite hacer cosas de forma sencilla y práctica, que de otro modo realmente serían sumamente complicadas, o simplemente no serían posibles.
Hasta el proximo post!
By Eric Roner 06/10/2020 - 11:18 am
Hola buen tarde muy buen articulo ,i consulta es: puedo utilizar rsync entre servidores linux a un storage windows, explico tengo una base de datos montada en centos 7 la cual genera backup diarios de la BD, estas copias requiero moverlas del servidor origen al storage que se encuentra en windows automaticamente es posible.
Saludos muchas gracias
By juan 07/12/2020 - 6:44 pm
Muy bueno tu trabajo, aplique le comado y funciono de maravilla pero cuando mande a copiar 60G solo ha copiado 35G ahora que lo intento nuevamente me devuelve esto:
rsync: Failed to exec shh: No such file or directory (2)
rsync error: error in IPC code (code 14) at pipe.c(85) [Receiver=3.1.2]
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in IPC code (code 14) at io.c(226) [Receiver=3.1.2]
Quiza puedes orientarme en este problema, ambos host son remotos
By Horacio Silva 06/22/2021 - 7:16 am
Pregunta: Como se podría hacer para copiar de un directorio a otro, pero únicamente copie los archivos desde una fecha dada en la instrucción?
By Luis Armando Medina 08/02/2021 - 6:28 am
Puedes crear un comando rsyn que respalde una lista de archivos basado en un comando find para esta lista de archivo aunque no se podrá mantener la estructura de directorios. por ejemplo rsync –progress –files-from=<(find /src_path -mtime -3 -type f -exec basename {} \;) /src_path/ /dst_path algunos ejemplos de find para un rango de fechas lo puedes encontrar en https://www.comoinstalarlinux.com/comandos-linux-find-con-ejemplos-2/