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
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