Pedindo que o rsync exclua arquivos no lado de recebimento que não existem no lado de envio, com exceções no lado de recebimento

28

Eu li estes tópicos:

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

Como você pede que o rsync copie arquivos e apague os que estão no lado de recebimento que não existem no lado de envio, com exceções? (por exemplo, não remova um repositório mercurial .hg no lado de recebimento, mesmo que não haja repositório no lado de envio).

Uma possibilidade?

Empréstimo da resposta de @Richard Holloway abaixo. Digamos que eu tenha a seguinte linha:

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

Pelo que entendi, essa linha faria rsync excluir tudo no caminho de recebimento que não existe no caminho de envio, exceto as coisas correspondidas por dont_delete_me . Minha pergunta agora é: O rsync manteria os arquivos no lado do destinatário que foram correspondidos por dont_delete_me mesmo que nada no lado de envio corresponda a dont_delete_me ?

    
por Amelio Vazquez-Reina 11.08.2011 / 16:24

2 respostas

33

Se você usar --delete e --exclude juntos, o que estiver no local excluído não será excluído, mesmo se os arquivos de origem forem removidos.

Mas isso levanta o problema de que a pasta não será rsync 'd em tudo. Então, você precisará de outro trabalho rsync para sync dessa pasta.

Por exemplo.

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

Você pode executá-los ao contrário, mas excluir todos os arquivos removidos e substituí-los, o que não é tão eficiente.

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

    
por 11.08.2011 / 17:45
4

Descobri que a solução a seguir 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 opção -n para executar uma execução a seco e não altere --delete para --delete-excluded !)

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

  • O diretório de origem src permanece inalterado
  • A pasta dest do destino corresponde à pasta de origem, exceto que:

    • os itens na lista do_not_send_to_dest não são enviados para o destino e
    • os itens na lista do_not_modify_in_dest não são modificados no destino.
  • (Nota: Não é problema para itens inexistentes serem listados em um dos arquivos " do_not_ ").

Explicação

Eu acho que como o rsync lê os argumentos da linha de comando da esquerda para a direita, o argumento --delete parece fazer com que o rsync "alterne modos" internamente, permitindo o segundo uso da opção --exclude-from novamente, mas com um significado diferente.

Espero que isso ajude.

Advertência:

  • Se um item na lista do_not_send_to_dest já existir no destino, então:

    • esse comando não remove esse item do destino (a menos que o item seja removido pela primeira vez do diretório de origem)
    • Cuidado: alterar --delete para --delete-excluded excluirá tudo o que estiver listado em uma de suas duas listas. xD (Talvez o rsync foi escrito para ser aberto / flexível, mas tem alguns com nuances?)

Uso leve testado.

Estou usando " rsync version 3.0.9 protocol version 30 ".

    
por 09.11.2013 / 09:20

Tags