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 tobackup
pasta que contenha link simbólico e use -L
opçõ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/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 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/etc
e/home
ao 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/etc
e/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 --relative
opção.
Neste caso, poderíamos ter algo assim:
rsync -aR /etc/fstab /home/user/download bkp
o que resultaria em bkp/etc/fstab
e 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 --relative
opçãoaqui)
Então, por exemplo, se fizéssemos isso
rsync -aR /home/./user1/download /home/./user2/download bkp
terminaríamos com bkp/user1/download
e 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