rsync lista de arquivos em subdiretórios para o servidor remoto e excluir estranhos

3

Não consegui encontrar a resposta para esta. Eu tentei todos os tipos de combinações de --include , --exclude , -r , --delete-excluded e diretório de origem.

Isso é o que estou tentando realizar:

  • Diretório de origem:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir2/File2-2
    Dir2/File2-3
    Dir3/File3-1
    Dir3/File3-2
    Dir3/File3-3
    ...
    
  • Diretório de destino:
    (estado desconhecido)

O que eu gostaria de fazer é fornecer um subconjunto pré-definido de arquivos do diretório de origem com o caminho relativo e rsync-los para o destino remoto, excluindo qualquer coisa no destino (incluindo diretórios) que não estava no subconjunto de arquivos.

Por exemplo, dado o diretório de origem acima:

  • Minha lista de arquivos predefinidos:

    Dir1/File1-2
    Dir3/File3-3
    
  • Diretório de destino:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir3/File3-1
    

Eu esperaria ter apenas Dir1 / File1-2, Dir3 / File3-3 e nenhum Dir2 no destino quando eu terminar. Também não esperarei que o Dir1 / File1-2 seja copiado novamente.

Coisas a serem notadas:

  • São arquivos muito grandes e estou tentando evitar que você precise copiá-los remotamente novamente, se não for necessário.
  • O conteúdo dos subdiretórios de origem muda todos os dias
  • A lista predefinida muda todos os dias, mas pode / incluirá arquivos na lista de ontem
  • Existem 0 arquivos no diretório de origem. Ele contém apenas subdiretórios que contêm os arquivos necessários para sincronizar
  • Os subdiretórios da origem são bastante estáticos. ou seja, Dir1, Dir2 e Dir3 sempre estarão lá

Vou continuar tentando descobrir se consigo encontrar a solução que estou procurando.

Atualizar :

Antes de tudo, quero agradecer jw013 pelas alterações de formatação. Eu segui a diretriz de ajuda, mas não entendi porque não estava formatando corretamente (pôster da primeira vez).

Usando as sugestões do Serge , eu criei o seguinte comando, mas ele ainda não remove os arquivos estranhos do destino que NÃO estão na lista de arquivos.

  • Comando

    rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/
    
por Dan Schaefer 18.10.2012 / 21:43

3 respostas

1

Você pode fazer isso usando

rsync -av --delete --update --include-from=LISTFILE   -f 'hide,! */' src/ dst

em que LISTFILE é um arquivo que contém todos os arquivos que devem ser sincronizados para o diretório de destino. Se seus arquivos não forem alterados, você poderá usar --ignore-existing em vez de --update . Leia a página de manual do rsync para detalhes.

    
por 18.12.2012 / 15:15
0

Há um número de opções de exclusão que você pode usar com o rsync para excluir arquivos no destino, se eles não existirem na origem:

        --del                   an alias for --delete-during
        --delete                delete extraneous files from dest dirs
        --delete-before         receiver deletes before xfer, not during
        --delete-during         receiver deletes during the transfer
        --delete-delay          find deletions during, delete after
        --delete-after          receiver deletes after transfer, not during

Além disso, você pode usar --ignore-existing para ignorar a cópia dos arquivos que existem no destino:

        --ignore-existing       skip updating files that exist on receiver

E para excluir os diretórios vazios, você deve usar:

    -m, --prune-empty-dirs      prune empty directory chains from file-list

Então, o comando

rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst

fará o que você está procurando, suponho

    
por 18.10.2012 / 22:26
0

Acho que você precisa se concentrar em --delete-excluded . Eu tentei localmente e parece funcionar como desejado. Eu começaria tentando

rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst

Não sei por que certas outras opções estão sendo sugeridas: p. O mais "interessante" é --ignore-existing . Pode valer a pena ter certeza de que você entende as otimizações mais amigáveis primeiro - -a ou -u .

Parece que você já está usando -a , o que implica em -t , que permite que o rsync otimize por padrão. "O Rsync localiza arquivos que precisam ser transferidos usando um algoritmo de" verificação rápida "(por padrão) que procura por arquivos que foram alterados em tamanho ou na hora da última modificação". Se você não estiver usando -a , geralmente é possível usar " -u or --update - ignorar arquivos que são mais recentes no receptor".

Se você quiser comparar a diferença com a otimização de "verificação rápida" desativada , use --checksum . (Também é útil se você deseja forçar a ressincronização de todos os arquivos existentes em algum momento em caso de corrupção. Ative o -v e você poderá ver quais arquivos tiveram que ser reescritos).

    
por 17.02.2013 / 11:51