Quero copiar e sincronizar diretórios usando rsync
ou --delete
em --delete-excluded
um script bash ou shell em um sistema Debian.
O diretório não foi sincronizado inicialmente, o que significa que os arquivos foram excluídos na origem.
Verifiquei as duas postagens e depois percebi que era devido ao *
.
Portanto, há diferenças entre src/
, src/.
esrc/*
Não se trata de arquivos ocultos ou algo do tipo.
Por que a opção 1 é tratada de forma diferente das opções 2 e 3 em termos de lógica?
Opção 1 (não funciona):
rsync -avr src/* dst/ --delete-excluded
rsync -avr src/* dst/ --delete
Opção 2 (funcionando):
rsync -avr src/ dst/ --delete-excluded
rsync -avr src/ dst/ --delete
Opção 3 (funcionando):
rsync -avr src/. dst/ --delete-excluded
rsync -avr src/. dst/ --delete
Quando excluo arquivos e diretórios em src
, eles não são excluídos/sincronizados com /*
, mas são com /
e /.
.
Do homem rsync:
--delete Isso diz ao rsync para excluir arquivos estranhos do lado receptor (aqueles que não estão no lado de envio), mas apenas para os diretórios que estão sendo sincronizados. Você deve ter pedido ao rsync para enviar o diretório inteiro (por exemplo, lqdirrq ou lqdir/rq) sem usar um curinga para o conteúdo do diretório (por exemplo, lqdir/*rq), pois o curinga é expandido pelo shell e o rsync recebe uma solicitação para transferir arquivos individuais, não o diretório pai dos arquivos. Arquivos que são excluídos da transferência também são excluídos de serem excluídos, a menos que você use a opção --delete-excluded ou marque as regras como correspondentes apenas no lado de envio (veja os modificadores include/exclude na seção FILTER RULES).
Não é basicamente a mesma coisa?
O que o rsync vê, porque o shell expande a/*, o rsync não conhece mais a pasta pai a/ – ele só recebe uma lista de arquivos/subdiretórios. Ele só compara os arquivos passados com o destino, não com o estado geral. --delete não pode excluir de forma confiável porque o rsync não sabe o que deveria estar dentro de a/.
O diretório principal é especificado com src/
, src/.
e src/*
está certo na lógica ou não, não entendi?
Considere isto:
Com esta configuração,
é expandido pelo shell para
Com isso,
rsync
não é possível determinar o que o usuário realmente quis dizer, então não apaga nada do alvo.As outras duas opções são inequívocas,
rsync
sabe exatamente o que fazer.De @ilkkachu: