Solicitando ao rsync para excluir arquivos no lado de recebimento que não existem no lado de envio, com exceções no lado de recebimento

29

Eu li estes tópicos:

Mas, tanto quanto posso dizer (talvez esteja faltando alguma coisa), eles não cobrem a seguinte pergunta:

Como você pede rsyncpara copiar arquivos e excluir aqueles no lado de recebimento que não existem no lado de envio, com exceções? (por exemplo, não remova um repositório mercurial .hgno lado de recebimento, mesmo se não houver repositório no lado de envio).

Uma possibilidade?

Empréstimos da resposta de @Richard Holloway abaixo. Digamos que tenho a seguinte linha:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Até onde eu entendi, essa linha faria rsyncexcluir tudo no caminho de recebimento que não existe no caminho de envio, exceto as coisas correspondentes dont_delete_me. Minha pergunta agora é: o rsync manterá os arquivos no lado de recebimento correspondentes, dont_delete_me mesmo que nada no lado de envio corresponda dont_delete_me?

Amelio Vazquez-Reina
fonte

Respostas:

33

Se você usar --deletee --excludejuntos o que está na localização excluída não vai ficar excluído, mesmo se os arquivos de origem são removidos.

Mas isso levanta a questão de que a pasta não será rsyncencontrada. Então, você precisará de outro rsynctrabalho para syncessa pasta.

Por exemplo.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Você poderia executá-los ao contrário, mas ele excluiria todos os arquivos removidos e os substituiria, o que não é tão eficiente.

Você não pode fazer isso como um forro.

Richard Holloway
fonte
Obrigado @ Richard. Sua resposta está me fazendo pensar que minha pergunta original pode ter sido mais fácil do que eu pensava. Se eu usar a linha única:, rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathisso não rsyncexcluiria tudo no caminho de recebimento que não existe no caminho de envio, exceto os itens correspondentes dont_delete_me? Mais importante, rsyncmanteria as coisas no lado receptor correspondidas dont_delete_me mesmo que nada no lado de envio correspondadont_delete_me ? Se for esse o caso, acho que é a única linha de que preciso, certo?
Amelio Vazquez-Reina
Você está correto, mas também não receberá novos arquivos e alterações na pasta dont_delete_me se fizer isso em uma linha. Se você não deseja sincronizar alterações e adições, basta usar o sinalizador --exclude conforme descrito aqui.
Richard Holloway
@AmV Os arquivos excluídos não são excluídos --delete, a menos que você especifique explicitamente --delete-excluded. Veja a descrição --deletee --delete-excludedno manual do rsync.
Gilles 'SO- stop be evil' (
4

Eu descobri que a seguinte solução funciona para meus propósitos:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Nota: adicione a -nopção para executar uma execução a seco e não mude --deletepara --delete-excluded!)

A execução do comando causa as seguintes propriedades:

  • O srcdiretório de origem permanece não modificado
  • A destpasta de destino corresponde à pasta de origem, exceto que:

    • itens da do_not_send_to_destlista não são enviados para o destino e
    • os itens da do_not_modify_in_destlista não são modificados no destino.
  • (Nota: não há problema em itens inexistentes serem listados nos do_not_arquivos " ".)

Explicação

Eu acho que quando o rsync lê os argumentos da linha de comando da esquerda para a direita, o --deleteargumento parece fazer com que o rsync internamente "alterne os modos" (em certo sentido), permitindo o segundo uso da --exclude-fromopção novamente, mas com um significado diferente.

Embargo:

  • Se um item da do_not_send_to_destlista já existir no destino, então:

    • esse comando não remove esse item do destino (a menos que o item seja removido primeiro do diretório de origem)
    • Cuidado: alterar --deletepara --delete-excludedexcluirá tudo do destino listado em uma das duas listas. xD (Talvez o rsync tenha sido escrito para ser aberto / flexível, mas tem alguns com nuances?)

Levemente uso testado.

Estou usando " rsync version 3.0.9 protocol version 30".

user2533809
fonte