En un rsync, ¿cómo excluyo todos los directorios que coinciden con un patrón?

8

En un rsync estoy tratando de excluir subdirectorios que coinciden con un patrón. Pero no puedo hacer que funcione. He seguido varios ejemplos encontrados aquí y en Google. Pero no obtengo los resultados correctos. Aquí está la opción bit de mi comando:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

La estructura de mi directorio fuente es

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Esto es parte de un script de respaldo. $ LNK es un enlace al destino rsync del día anterior.

No quiero / root / branch1, / root / branch2, / root / branch3. o sus contenidos a sincronizar. Pero son.

Aquí están los bits de exclusión que ya he probado:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Gracias por cualquier ayuda / consejo.

EDITAR - para abordar el indicador "posible duplicado"

Esta pregunta se refiere a una lista conocida de directorios. Necesito excluir cualquier directorio que siga un patrón, incluso si esos directorios aún no existen. es decir, a partir de mi ejemplo, /branch*se pueden agregar otros directorios nombrados . Necesito hacer mi script a prueba de futuro y evitar editar el script cuando se agrega un directorio que coincide con el patrón, ya que esos directorios pueden ser temporales.

Roger Creasy
fuente
su parámetro de exclusión está bien. Si rsync ignora la rama * al copiar, también lo ignora al eliminar de dest, por lo que debe eliminar manualmente estos directorios en el destino una vez.
Ipor Sircer
el destino es un directorio nuevo y vacío, creado por mi script bash. Eliminé los directorios branch * del directorio link-dest, sin resultado.
Roger Creasy
1
Tiene que usar un patrón completo explícito como *branch*o /root/branch*no la forma corta branch*- corta no se encuentra y, por lo tanto, no se excluye.
Kondybas
@Kondybas Entonces, ¿todo está bien en mis opciones excepto que necesito anteponer un '*' a mi rama de exclusión? ( --exclude '*branch*)
Roger Creasy

Respuestas:

2

Excluye la regla es correcta. Sin embargo, rsync no eliminará los archivos excluidos en el destino sin el parámetro adicional --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Ejemplo:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file
M. Glatki
fuente
Cambié mis opciones en el script a -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKla copia de seguridad de Anoche todavía hice una copia de seguridad de los directorios / branch *.
Roger Creasy
1

rsync versión 3.1.3 (posiblemente anterior, no se ha marcado) excluye correctamente los subdirectorios que utilizan esta sintaxis (obviamente, reemplazando exclude_dirnamecon el patrón que desea excluir):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Esto también funciona con comodines. La pregunta original usa 'branch*', así que esto funciona:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

Espero que esto ayude.

AaronDanielson
fuente