Em um rsync, como excluo todos os diretórios que correspondem a um padrão?

8

Em um rsync, estou tentando excluir subdiretórios que correspondem a um padrão. Mas não consigo fazer funcionar. Eu segui vários exemplos encontrados aqui e no Google. Mas não obtenho os resultados corretos. Aqui está a parte do meu comando:

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

Minha estrutura de diretórios de origem é

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

Isso faz parte de um script de backup. $ LNK é um link para o destino rsync do dia anterior.

Eu não quero / root / branch1, / root / branch2, / root / branch3. ou seu conteúdo a ser sincronizado. Mas eles são.

Aqui estão os bits de exclusão que eu já tentei:

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

Obrigado por qualquer ajuda / conselho.

EDIT - para endereçar o sinalizador "possível duplicado"

Esta pergunta é referente a uma lista conhecida de diretórios. Preciso excluir todos os diretórios que seguem um padrão, mesmo que esses diretórios ainda não existam. ou seja, do meu exemplo, outros diretórios nomeados /branch*podem ser adicionados. Preciso tornar meu script à prova de futuro e evitar a edição do script quando um diretório que corresponda ao padrão for adicionado, pois esses diretórios podem ser temporários.

Roger Creasy
fonte
seu parâmetro de exclusão está ok. Se o rsync ignora o branch * ao copiar, ele também o ignora ao excluir do destino, portanto, você deve excluir manualmente esses diretórios no destino uma vez.
Ipor Sircer
o destino é um diretório novo e vazio, criado pelo meu script bash. Excluí os diretórios branch * do diretório link-dest, sem sucesso.
Roger Creasy
1
Você precisa usar um padrão completo explícito, como *branch*ou /root/branch*não, o branch*formulário curto - curto não é encontrado e, portanto, não é excluído.
Kondybas # 8/16
@ Kondybas Então, tudo está bem nas minhas opções, exceto que eu preciso acrescentar um '*' ao meu ramo de exclusão? ( --exclude '*branch*)
Roger Creasy 08/09

Respostas:

2

Você exclui a regra está correta. No entanto, o rsync não excluirá os arquivos excluídos no destino sem o parâmetro extra --delete-excluded:

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

Exemplo:

#  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
fonte
Mudei minhas opções no script para -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKo backup da noite passada e ainda fiz o backup dos diretórios / branch *.
Roger Creasy
1

A versão 3.1.3 do rsync (possivelmente anterior, não foi verificada) exclui corretamente os subdiretórios usando esta sintaxe (obviamente substituindo exclude_dirnamepelo padrão que você deseja excluir):

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

Isso também funciona com caracteres curinga. Utiliza a pergunta original 'branch*', então isso funciona:

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

Espero que isto ajude.

AaronDanielson
fonte