O que você quer fazer é razoável, mas usar rsync
para fazer isso sozinho não é. Então a resposta é não .
O motivo é simples: rsync
não mantém histórico do que estava em cada diretório e não tem como saber o que precisa ser excluído e quais não. Não sem suporte adicional.
Você deve se perguntar por que gosta de fazer isso com rsync
e deixar isso mais claro. Existem outros programas que usam librsync1.so
que são mais inteligentes.
Com as restrições relaxadas de que você não precisa de
rsync
per se, você pode dar uma olhada em rdiff-backup :
mkdir a
touch a/xx
touch a/yy
rdiff-backup a b
ls b
Isso mostra que xx
e yy
estão em b
.
touch b/zz
rm a/xx
rdiff-backup a b
Isso mostra xx
e zz
em b
. rdiff-backup
também mantém um diretório rdiff-backup-data
em b
para que você possa reverter quaisquer alterações, você deve limpá-la regularmente usando os comandos rdiff-backup
. (O exemplo é com arquivos locais para mostrar que dados extras no destino não são excluídos, mas o rdiff-backup também funciona em uma rede).
Outra alternativa é configurar algum sistema de controle de revisão distribuído (mercurial, bazaar, git). Com mercurial, e. você pode ter um script (eu uso um Makefile para isso), que empurra todas as mudanças para o servidor e então faz uma atualização dos arquivos com check-out, ignora quaisquer arquivos adicionais que estão no servidor remoto (mas não foram colocados sob controle de revisão).
No servidor, você faria:
hg init
hg add file_list_excluding_that_should_not_should_be_deleted_if_not_on_client
hg commit -m "initial setup"
No cliente:
hg clone ssh://username@server/dir_to_repository
Agora, se você remover um arquivo no cliente e fizer isso:
hg commit -m "removed file"
ssh username@server "cd dir_to_repository; hg update --clean"
Seu arquivo removido é removido no servidor, mas quaisquer outros dados (não adicionados ao repositório) não são excluídos.