Complexo inclui / exclui com rsync

14

Estou tentando descobrir a sintaxe do filtro rsync para executar inclusões / exclusões complexas e tentando obter o seguinte:

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*

Eu tentei muitas variações na sintaxe do filtro e, apesar de ler a página do manual muitas vezes, não consigo esse tipo de efeito. Os filtros Rsync parecem ser muito poderosos, e acho difícil acreditar que eles não possam lidar com um cenário comum como esse.

brianmathis
fonte

Respostas:

17

Você precisa incluir todos os diretórios pai no diretório desejado antes de usar a regra de exclusão.

Por exemplo, eu uso o seguinte em um script de backup:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST

Portanto, no seu caso, você precisaria de algo como o seguinte:

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST
Shane Meyers
fonte
Excelente. Levou algum tempo.
yclian
De alguma forma, quando li o artigo man rsync, entendi errado a ordem correta da mistura que inclui e exclui. Levei uma hora para descobrir isso ...
Adam Ryczkowski
6

Na linha de comando:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST

Remova --dry-runpara torná-lo funcional, substitua "DEST" pelo seu destino e adicione usuário e host à origem "/", se necessário.

De um arquivo de regras:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST

onde o conteúdo de /etc/rsync/somerules.rulespode estar:

+/ /home/user1
-/ /home/*

Você deve testá-los e pode precisar fazer alguns ajustes, mas isso deve começar.

Pausado até novo aviso.
fonte
OK, isso funciona. Eu tenho um caso mais complexo que eu adicionei à pergunta. A inclusão adicional não funciona com o cenário subdir.
brianmathis