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