10 comando rsync de Linux para excluir archivos / directorios

Rsync (Remote Sync) es un comando más comúnmente utilizado para copiar y sincronizar archivos y directorios de forma remota y local en sistemas Linux / Unix. Con la ayuda del comando rsync, puede copiar y sincronizar sus datos de forma remota y local en directorios, discos y redes, realizar copias de seguridad de datos y duplicar entre dos máquinas Linux.

Rsync es una de las utilidades más útiles para un administrador de servidor, pero sincroniza todo de forma predeterminada, lo que puede resultar molesto si tu aplicación crea muchos archivos temporales. A continuación, se explica cómo excluir archivos al usar rsync.

Características importantes del comando rsync

  • Velocidad : La primera vez, rsync replica todo el contenido entre los directorios de origen y destino. La próxima vez, rsync transfiere solo los bloques o bytes modificados a la ubicación de destino, lo que hace que la transferencia sea realmente rápida.
  • Seguridad : rsync permite el cifrado de datos mediante el protocolo ssh durante la transferencia.
  • Ancho de banda bajo: rsync usa compresión y descompresión de datos bloque por bloque en el extremo de envío y recepción, respectivamente. Por lo tanto, el ancho de banda utilizado por rsync será siempre menor en comparación con otros protocolos de transferencia de archivos como FTP.
  • Privilegios : No se requieren privilegios especiales para instalar y ejecutar rsync.

La sintaxis básica de rsync es muy sencilla y funciona de manera similar a ssh, scp y cp.

$ sudo rsync options source destination

  • -v: detallado.
  • -r: copia datos de forma recursiva (pero no conserva las marcas de tiempo ni los permisos mientras transfiere datos).
  • -a: modo de archivo, el modo de archivo permite copiar archivos de forma recursiva y también conserva los enlaces simbólicos, los permisos de archivo, la propiedad de usuarios y grupos y las marcas de tiempo.
  • -z: comprime los datos del archivo.
  • -h: números de salida legibles por humanos en un formato legible por humanos.
  • -d: transferir directorios sin recurrir -e: especificar el ssh como shell remoto.

Primero, cree una estructura de directorio de muestra como se muestra a continuación (con algunos archivos vacíos) que se puede usar con fines de prueba.

$ cd ~
$ sudo mkdir -p source/dir1/dir2
$ sudo mkdir -p source/dir3
$ sudo touch source/file1.txt
$ sudo touch source/file2.txt
$ sudo touch source/dir1/dir2/file3.txt
$ sudo touch source/dir3/file4.txt

Los comandos anteriores crearán un directorio de origen (en el directorio de inicio) con la siguiente estructura: Para ver la estructura del directorio de origen, escriba el siguiente comando.

$ sudo find source/

source
- file1.txt
- file2.txt
- dir1
- dir2
- file3.txt
- dir3
- file4.txt

1) Excluir un directorio específico

Primero quitamos destination directorio si existe escribiendo debajo del comando.

$ sudo rm -rf destination

Si no queremos sincronizar el dir3 y sus subdirectorios desde la carpeta de origen a la de destino, usamos rsync --exclude opción como se muestra a continuación.

$ sudo rsync -avz --exclude 'dir3' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude 'dir3' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir1/dir2/file3.txt

sent 307 bytes received 126 bytes 866.00 bytes/sec
total size is 0 speedup is 0.00

2) Excluir un archivo específico

Si no queremos sincronizar el file3.txt desde la carpeta de origen a la de destino, escribimos el siguiente comando.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude 'dir1/dir2/file3.txt' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude 'dir1/dir2/file3.txt' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir3/
dir3/file4.txt

sent 338 bytes received 130 bytes 936.00 bytes/sec
total size is 0 speedup is 0.00

Para example en tiempo real donde desea rsync / var a un directorio de respaldo pero no desea incluir la caché y la carpeta tmp que generalmente no contienen contenido importante entre reinicios, puede usar el siguiente comando:

$ sudo rsync -aAXhv --exclude={"/var/cache","/var/tmp"} /var [email protected]:destination/

3) Excluir un tipo de archivo específico

Para excluir un específico con extensión específica, usamos el patrón apropiado. Para example, para excluir todos los archivos que contienen .txt como extensión, escribimos el siguiente comando.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude '*.txt' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude '*.txt' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
dir1/
dir1/dir2/
dir3/

sent 136 bytes received 65 bytes 402.00 bytes/sec
total size is 0 speedup is 0.00

4) Excluya varios directorios que coincidan con un patrón

Excluiremos cualquier directorio (o subdirectorios) bajo source/ que comienza con “dir”

$ sudo rm -rf destination

$ sudo rsync -avz --exclude 'dir*' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ $ sudo rsync -avz --exclude 'dir*' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt

sent 168 bytes received 91 bytes 518.00 bytes/sec
total size is 0 speedup is 0.00

5) Excluya varios archivos y directorios al mismo tiempo

Primero, cree un archivo de texto con una lista de todos los archivos y directorios que no desea respaldar. Esta es la lista de archivos y directorios que desea excluir del rsync.

$ sudo nano exclude-list.txt

file2.txt
dir3/file4.txt

A continuación, ejecute rsync usando --exclude-from opción con la exclude-list.txt Como se muestra abajo.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude-from 'exclude-list.txt' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude-from 'exclude-list.txt' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
dir1/
dir1/dir2/
dir1/dir2/file3.txt
dir3/

sent 277 bytes received 111 bytes 776.00 bytes/sec
total size is 0 speedup is 0.00

6) La ruta de exclusión siempre es relativa

La opción de exclusión parece tener una ruta completa (es decir, /dir3/file4.txt). Pero, desde el punto de vista de rsync, la ruta de exclusión siempre es relativa y se tratará como dir3 / file4.txt. En el example a continuación, rsync buscará dir3 en el directorio de origen (y no en el directorio / root).

$ sudo rm -rf destination

$ sudo rsync -avz --exclude '/dir3/file4.txt' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude '/dir3/file4.txt' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir1/dir2/file3.txt
dir3/

sent 334 bytes received 130 bytes 928.00 bytes/sec
total size is 0 speedup is 0.00

Es similar al comando siguiente.

$ sudo rsync -avz --exclude 'dir3/file4.txt' source/ destination/

7) Excluir archivos de la línea de comando

también puede excluir archivos directamente desde la línea de comando, esto es útil cuando tiene una menor cantidad de archivos para excluir. Para example si deseamos sincronizar / fuente a un directorio de destino pero no desea incluir archivos file3.txt y file4.txt, podemos usar el siguiente comando.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude={"/dir1/dir2/file3.txt","/dir3/file4.txt"} source/ destinaton/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude={"/dir1/dir2/file3.txt","/dir3/file4.txt"} source/ [email protected]:destination/

output
sending incremental file list
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir3/

sent 268 bytes received 73 bytes 682.00 bytes/sec
total size is 0 speedup is 0.00

8) Excluya varios archivos o carpetas

Cuando queremos excluir tipo de archivos *.txt y carpeta específica dir3, podemos escribir el comando a continuación.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude '*.txt' --exclude 'dir3' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude '*.txt' --exclude 'dir3' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
dir1/
dir1/dir2/

sent 109 bytes received 61 bytes 340.00 bytes/sec
total size is 0 speedup is 0.00

9) Excluya varios directorios con un patrón específico

También podemos proporcionar varios directorios con un patrón específico para excluir. Usaremos comodines * completar dir nombre del directorio.

$ sudo rm -rf destination

$ sudo rsync -avz --exclude 'dir*' source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --exclude 'dir*' source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt

sent 168 bytes received 91 bytes 518.00 bytes/sec
total size is 0 speedup is 0.00

10) Excluir archivos de ciertos tamaños

Durante el proceso de copia de seguridad, encontramos algunos archivos de gran tamaño que tardaron mucho en copiarse. tenemos que copiar algunas películas que tienen un tamaño superior a 1 GB. Por lo tanto, creemos que sería mejor si pudiéramos simplemente excluir los archivos grandes o cualquier archivo sin importancia para completar la copia de seguridad lo antes posible.

Para example, queremos excluir los archivos de más de 3 MB de tamaño. Todo lo que tenemos que hacer es usar --max-size=SIZE opción con el comando rsync. Esta opción no transferirá ningún archivo más grande que el tamaño especificado.

$ sudo rm -rf destination

$ sudo rsync -avz --max-size=3m source/ destination/

Para la sincronización remota, podemos escribir el comando a continuación.

$ sudo rsync -avz --max-size=3m source/ [email protected]:destination/

output
sending incremental file list
created directory destination
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir1/dir2/Bootstrap-tutorial.pdf
dir1/dir2/file3.txt
dir3/
dir3/file4.txt

sent 3,080,297 bytes received 168 bytes 6,160,930.00 bytes/sec
total size is 8,101,480 speedup is 2.63

También podemos usar --min-size=SIZE para excluir cualquier archivo más pequeño que el tamaño especificado.

por example, para excluir archivos de menos de 7 MB, ejecute el siguiente comando.

$ sudo rsync -avz --min-size=7m source/ destination/

output
sending incremental file list
created directory destination
./
dir1/
dir1/dir2/
dir3/

sent 313 bytes received 65 bytes 756.00 bytes/sec
total size is 8,101,480 speedup is 21,432.49

Los sufijos de tamaños son los siguientes:

  • “K” (o “KiB”) es un kilobyte (1024)
  • “M” (o “MiB”) es un megabyte (1024 * 1024)
  • “G” (o “GiB”) es un gigabyte (1024 * 1024 * 1024)

Si desea que el multiplicador sea 1000 en lugar de 1024, use “KB”, “MB” o “GB” (Nota: también se aceptan minúsculas para todos los valores).

¡Espero que hayan disfrutado este tutorial! Por favor deje sus comentarios

Leer también:

  • Ejemplos de Rsync para transferir archivos en Linux
  • Dcp: herramienta para transferir archivos de forma segura entre computadoras Linux