Cómo excluir ficheros y directorios en Rsync

Rsync es una fantástica y potente herramienta para sincronizar archivos y carpetas, desde la línea de comandos, entre dos ubicaciones a través de una shell remota.

Esta herramienta permite reflejar datos, crear copias de seguridad incrementales y copiar archivos entre sistemas. Rsync una de las cosas que también permite es excluir, al copiar los datos, ficheros y carpetas, según su nombre o ubicación.

La idea de esta entrada es explicar cómo excluir archivos y directorios con rsync.

Si es la primera vez que oyes hablar de rsync y no sabes en qué consiste, aquí te explico: Copias de seguridad con rsync

Logo oficial de rsync

Excluir ficheros y directorios en Rsync

En los siguientes ejemplos, usaremos rsync con la opción -a. Esto le indica a rsync que sincronice directorios de forma recursiva, transfiera dispositivos especiales y de bloqueos, además de preservar los enlaces simbólicos, tiempos de modificación, permisos y propiedades.

Al excluir archivos o directorios, debemos utilizar sus rutas relativas al directorio de origen o bien indicar las rutas absolutas.

Existen dosopciones para especificar los archivos y directorios que deseamos excluir:

  • Desde una línea de comandos, utilizando la opción --exclude
  • Desde un archivo, usando la opción --exclude-from

Ahora veremos algunos ejemplos de uso.

Excluir un archivo específico

Para excluir un archivo específico, debemos pasar la ruta relativa al archivo a la opción --exclude.

En el siguiente ejemplo, el archivo origen_directorio/archivo.txt no se transferirá:

rsync -a --exclude 'fichero.txt' origen_directorio/ destino_directorio/

Excluir un directorio específico

Excluir un directorio específico es lo mismo que excluir un archivo, simplemente debemos pasar la ruta relativa al directorio a la opción --exclude como se muestra a continuación:

rsync -a --exclude 'directorio1' origen_directorio/ destino_directorio/

Si deseamos excluir el contenido del directorio pero no el directorio en sí, debemos usar directorio1/*, de esta manera:

rsync -a --exclude 'directorio1/*' origen_directorio/ destino_directorio/

Excluir varios o archivos o directorio

Para excluir varios archivos o directorios, simplemente debemos especificar varias opciones de exclusión:

rsync -a --exclude 'fichero1.txt' --exclude 'directorio1/*' \
--exclude 'directorio2' origen_directorio/ destino_directorio'

Si preferimos usar una sola opción --exclude, podemos enumerar los archivos y directorios que deseamos excluir entre llaves {} separados por una coma como se muestra a continuación:

rsync -a --exclude = {'fichero1.txt','directorio1/*','directorio2'} \
origen_directorio/ destino_directorio/

Si la cantidad de archivos y/o directorios que deseamos excluir es grande, en lugar de utilizar varias opciones de --exclude, podemos especificar los archivos y directorios que deseamos excluir en un archivo y pasar el archivo a --exclude-from opción.

El siguiente comando hace exactamente lo mismo que el anterior:

rsync -a --exclude-from = 'exclude-fichero.txt' \
origen_directorio/ destino_directorio/

El fichero tendría este contenido:

fichero1.txt
directorio1/*
directorio2

Excluir varios archivos o directorios según un patrón

Con rsync también podemos excluir archivos y directorios según un patrón que coincida con el nombre del archivo o directorio.

Por ejemplo, para excluir los archivos .jpg, lo haríamos así:

rsync -a --exclude '*.jpg*' origen_directorio/ destino_directorio/

Es un poco más complicado excluir todos los demás archivos y directorios, excepto aquellos que coinciden con un patrón determinado. Supongamos que deseamos excluir todos los demás archivos y directorios, excepto los archivos que terminan en .jpg

Por ejemplo:

rsync -a -m --include='*.jpg' --include='*/' --exclude='*' origen_directorio/ destino_directorio/

Cuando se utiliza la opción de inclusión / exclusión múltiple, se aplica la primera regla de coincidencia.

  • –include=’*.jpg’ – Primero incluimos todos los archivos .jpg.
  • –include = ‘*/’ – Entonces estamos incluyendo todos los directorios dentro del directorio en origen_directorio. Sin esto, rsync solo copiará archivos * .jpg en el directorio de nivel superior.
  • -m – Elimina los directorios vacíos.

También se puede combinar con otros comandos como find, utilizando tuberías o pipes.

Para elaborar esta entrada he consultado:

Linuxsize.com – How to Exclude Files and Directories with Rsync

2 Respuestas

  1. 01101001b dice:

    Hacía rato q no leía un artículo tan útil sobre rsync. Muchísimas gracias!

  2. Walfrido dice:

    El artículo es genial, pero a no logro encontrar la forma de excluir los archivos uando tienes el mismo NOMBRE en «oriegen», «DIR» cuando se compara para tranferir a otra si tuvieren nombre direrente y finalmente «destino». Es decir, en el artículo se muestra la forma de excluir uno o varios archivos específicos siguiendo un PATRON, pero no cuando los nombres de los archivos son idénticos. Necesito comparar archivos de la carpeta A (origen) con la carpeta B (DIR) y los que estén en «A» diferentes en nombres, sin tener en cuenta tamaño o marca de tiempo que no estén en «B» transferirlos a «C» (destino final) si allí tampoco se encuentran con igual nombre. Gracias anticipadas por su apreciable colaboración.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.