Como sincronizar novamente várias pastas de origem

Como sincronizar novamente várias pastas de origem

Quero sincronizar novamente várias fontes e me pergunto a melhor maneira de conseguir isso.

por exemplo

/etc/fstab
/home/user/download

Pensei em 3 soluções:

  • Solução 1

chamada múltipla para rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: mais difícil ter estatísticas agregadas

  • Solução 2

crie uma tobackuppasta que contenha link simbólico e use -Lopções

sync -aL /home/user/tobackup bkp

con: o conteúdo para backup não deve conter links simbólicos

  • Solução 3

mova os arquivos para backup e crie um link simbólico no local original

rsync -a /home/user/tobackup bkp

con: alguma configuração manual

Qual você recomenda?

Existe uma maneira melhor ?

Responder1

Você pode passar vários argumentos de origem.

rsync -a /etc/fstab /home/user/download bkp

Isso cria bkp/fstabe bkp/download, como os comandos separados que você deu. Pode ser desejável preservar a estrutura de origem. Para fazer isso, use /como fonte e useregras de inclusão-exclusãopara especificar quais arquivos copiar. Existem duas maneiras de fazer isso:

  • Inclua explicitamente cada arquivo, bem como cada componente de diretório que leva a ele, /***no final dos diretórios quando desejar copiar toda a árvore de diretórios:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Inclua todos os diretórios de nível superior com /*/(para que o rsync percorra /etce /homeao procurar arquivos para copiar) e diretórios de segundo nível com /*/*/(para /home/user), mas remova os diretórios nos quais nenhum arquivo é copiado. Isso é mais conveniente porque você não precisa listar os pais explicitamente. Você poderia até usar --prune-empty-dirs --include='*/'em vez de contar o número de níveis, mas isso é impraticável aqui, pois o rsync percorreria todo o sistema de arquivos para explorar diretórios, mesmo que nenhuma das regras de inclusão possa corresponder a algo fora de /etce /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

Responder2

Eu realmente gosto da resposta de Gilles, no entanto, gostaria de acrescentar que, na minha opinião, o requisito de sincronizar várias pastas enquanto preserva a estrutura de diretórios é melhor atendido passando vários argumentos de origem em conjunto com a --relativeopção.

Neste caso, poderíamos ter algo assim:

rsync -aR /etc/fstab /home/user/download bkp

o que resultaria em bkp/etc/fstabe bkp/home/user/download.

A melhor parte disso é que (acredito que desde o rsync v. 2.6.7) podemos, em essência, controlar quanto da estrutura de diretórios queremos replicar no destino.
(Veja a documentação sobre a --relativeopçãoaqui)

Então, por exemplo, se fizéssemos isso

rsync -aR /home/./user1/download /home/./user2/download bkp

terminaríamos com bkp/user1/downloade bkp/user2/download.

Responder3

Isso também funciona - chaves, contendo uma lista de fontes separadas por vírgulas.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Um pouco semelhante ao que acontece quando você invoca chaves sytnax com cp e alguns outros utilitários:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

informação relacionada