rsync com apenas um arquivo de regras, exclua alguns caminhos, mas inclua sub-caminhos selecionados, recursivamente

3

Desejo excluir todo o conteúdo de uma pasta, mas algumas de suas subpastas, e quero fazer isso com apenas um arquivo de regras, sem adicionar as opções de linha de comando --exclude ou --include . Isso é possível? Um único arquivo de regras é importante porque acho mais fácil manter e documentar.

Eu corro o seguinte comando

rsync -a -F --filter "merge backup-filter" /mnt/home/common /mnt/backup

com o arquivo backup-filter :

# non-rooted rules take precedence
+ .git/*
+ .gitignore
- .*.sw?

# rooted rules
+ /common/backup*
- /common/opt/
+ /common/usr/

# FIXME
+ /common/root/startup/*
+ /common/root/.config/gopt/*
- /common/root/*

E dois .rsync-filter arquivos

# cat ./usr/bin/.rsync-filter
# Assume command-line option --filter=':- .gitignore', which
# backs up all file/folders that aren't listed in ./.gitignore

# cat ./usr/.rsync-filter
+ usr/bin
- */

O bloco de regras começando em FIXME é a peça quebrada. Destina-se a excluir todo o conteúdo de /common/root , mas permite que o conteúdo de startup e .config/gopt seja copiado. Está quebrado porque startup e .config/gopt não são copiados.

Conforme o tempo passa, planejo adicionar mais caminhos excluídos em vários níveis e alguns sub-caminhos incluídos, como o que estou fazendo aqui para o caminho /common/root . Então, o arquivo de regras vai crescer consideravelmente.

    
por stepse 01.03.2016 / 11:11

1 resposta

1

Você precisa disso:

+ /common/root/startup/
+ /common/root/startup/*
+ /common/root/.config/
+ /common/root/.config/gopt/
+ /common/root/.config/gopt/*
- /common/root/.config/*
- /common/root/*

Ou talvez isso, se você não quiser realmente substituir regras específicas de arquivos posteriores:

+ /common/root/startup/
+ /common/root/.config/
+ /common/root/.config/gopt/
- /common/root/.config/*
- /common/root/*

O problema é que ele nunca recorreu ao startup ou .config porque o - /common/root/* disse que não.

Esta versão diz explicitamente que você faz deseja esses diretórios. Você tem que fazer isso para todos os níveis de diretório pai, se você quiser escolher subdiretórios, como este.

Outro truque é incluir todos os diretórios com + */ , próximo ao topo e, em seguida, excluir arquivos que você não quer com - /common/root/** . Você pode então arrumar a desordem de diretórios vazios com --prune-empty-dirs , mas esteja ciente de que isso irá excluir diretórios vazios real , bem como aqueles cujo conteúdo você escolheu excluir.

    
por 09.03.2016 / 18:26

Tags