Como sincronizar várias pastas de origem


34

Quero sincronizar 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 de ter estatísticas agregadas

  • Solução 2

crie uma tobackuppasta que contém o link simbólico e use as -Lopções

sync -aL /home/user/tobackup bkp

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

  • Solução 3

mover arquivos para o backup e criar o link simbólico no local original

rsync -a /home/user/tobackup bkp

con: alguma configuração manual

Qual você recomenda?

Existe uma maneira melhor ?


Respostas:


33

Você pode passar vários argumentos de origem.

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

Isso cria bkp/fstab e 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 use regras de inclusão-exclusão para especificar quais arquivos copiar. Existem duas maneiras de fazer isso:

  • Inclua explicitamente cada arquivo, bem como cada componente de diretório que o conduz, /***no final dos diretórios, quando você deseja 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 atravesse /etce /homeao procurar arquivos para copiar) e os diretórios de segundo nível com /*/*/(para /home/user), mas retire os diretórios nos quais nenhum arquivo é copiado. Isso é mais conveniente porque você não precisa listar os pais explicitamente. Você pode até usar em --prune-empty-dirs --include='*/'vez de contar o número de níveis, mas isso é impraticável aqui, pois o rsync percorre todo o sistema de arquivos para explorar diretórios, mesmo que nenhuma das regras de inclusão possa corresponder a nada fora /etce /home/user/download.

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

1
Ótimo, mas como manter a estrutura de diretórios dentro do bkp?
Rodrigo

Quero dizer, bkp / etc / fstab e bkp / home / user / dowlonad? Ou talvez / bkp / fstab e bkp / download?
Rodrigo

@Rodrigo Eu editei minha resposta
Gilles 'SO- stop be evil'

13

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.

Nesse caso, poderíamos ter o seguinte:

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

o que resultaria bkp/etc/fstabebkp/home/user/download .

A melhor parte disso é que (acredito que desde o rsync v. 2.6.7) podemos essencialmente controlar quanto da estrutura de diretórios queremos replicar no receptor.
(Veja a documentação na --relativeopção aqui )

Então, por exemplo, se fizermos isso

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

nós acabaríamos com bkp/user1/downloade bkp/user2/download.


2

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

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

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

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

Como você especificaria a porta ssh com isso? Essa sintaxe parece funcionar ao usar-e
tcurdt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.