Como usar o Rsync para sincronizar diretórios locais e remotos

Introdução

O Rsync, que significa “sincronização remota”, é uma ferramenta de sincronização remota e local. Ele usa um algoritmo que minimiza a quantidade de dados copiados ao mover apenas as porções de arquivos que foram alteradas.

Neste guia, iremos abordar o uso básico deste utilitário poderoso.

O que é o Rsync?

O Rsync é uma ferramenta de sincronização habilitada em rede muito. Devido à sua onipresença em sistemas Linux e do tipo Unix, além da sua popularidade como uma ferramenta para scripts de sistema, ela é incluída na maioria das distribuições Linux por padrão.

Sintaxe básica

A sintaxe básica do rsync é bastante simples e opera de uma maneira semelhante ao ssh, scp e cp.

Vamos criar dois diretórios de teste e alguns arquivos de teste com os seguintes comandos:

  • cd ~
  • mkdir dir1
  • mkdir dir2
  • touch dir1/file{1..100}

Agora, temos um diretório chamado dir1 contendo 100 arquivos vazios.

  • ls dir1
Outputfile1    file18  file27  file36  file45  file54  file63  file72  file81  file90 file10   file19  file28  file37  file46  file55  file64  file73  file82  file91 file100  file2   file29  file38  file47  file56  file65  file74  file83  file92 file11   file20  file3   file39  file48  file57  file66  file75  file84  file93 file12   file21  file30  file4   file49  file58  file67  file76  file85  file94 file13   file22  file31  file40  file5   file59  file68  file77  file86  file95 file14   file23  file32  file41  file50  file6   file69  file78  file87  file96 file15   file24  file33  file42  file51  file60  file7   file79  file88  file97 file16   file25  file34  file43  file52  file61  file70  file8   file89  file98 file17   file26  file35  file44  file53  file62  file71  file80  file9   file99 

Também temos um diretório vazio chamado dir2.

Para sincronizar o conteúdo de dir1 em dir2 no mesmo sistema, digite:

  • rsync -r dir1/ dir2

A opção -r significa recursivo, que é necessário para a sincronização de diretórios.

Também poderíamos usar o sinalizador -a como alternativa:

  • rsync -a dir1/ dir2

A opção -a é um sinalizador de combinação. Ela representa “arquivo” e sincroniza recursivamente e preserva links simbólicos, arquivos especiais e de dispositivo, horários de modificação, grupo, proprietário e permissões. Ela é mais comumente usada do que -r e geralmente é o que você vai desejar usar.

Uma nota importante

Você pode ter notado que existe uma barra à direita (/) no final do primeiro argumento nos comandos acima:

  • rsync -a dir1/ dir2

Isso é necessário e significa “o conteúdo de dir1”. A alternativa, sem a barra à direita, colocaria o dir1, incluindo o diretório, dentro do dir2. Isso criaria uma hierarquia como esta:

  • ~/dir2/dir1/[files]

Sempre verifique duas vezes seus argumentos antes de executar um comando rsync. O Rsync fornece um método para fazer isso passando as opções -n ou --dry-run. O sinalizador -v (para verboso, prolixo) também é necessário para obter o resultado apropriado:

  • rsync -anv dir1/ dir2
Outputsending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . . 

Compare esse resultado com o resultado que obtemos ao remover a barra à direita:

  • rsync -anv dir1 dir2
Outputsending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . . 

Você pode ver aqui que o diretório em si foi transferido.

Como usar o Rsync para sincronizar com um sistema remoto

Sincronizar com um sistema remoto é trivial se você possuir acesso SSH à máquina remota e o rsync instalado em ambos os lados. Depois de ter o acesso SSH verificado entre as duas máquinas, sincronize a pasta dir1 de antes com um computador remoto usando esta sintaxe (observe que queremos transferir o diretório real neste caso, então omitimos a barra à direita):

Isso é chamado de uma operação “push”, pois empurra um diretório do sistema local para um sistema remoto. A operação oposta é “pull”. Ela é usada para sincronizar um diretório remoto com o sistema local. Se o dir1 estivesse no sistema remoto em vez de no nosso sistema local, a sintaxe seria:

Assim como cp e ferramentas similares, a fonte é sempre o primeiro argumento, e o destino é sempre o segundo.

Opções úteis para o Rsync

O Rsync oferece muitas opções para alterar o comportamento padrão do utilitário. Já discutimos alguns dos sinalizadores mais necessários.

Se estiver transferindo arquivos que ainda não foram comprimidos, como arquivos de texto, você pode reduzir a transferência de rede adicionando compressão com a opção -z:

  • rsync -az source destination

O sinalizador -P é muito útil. Ele combina os sinalizadores --progress e --partial. O primeiro deles lhe dá uma barra de progresso para as transferências e o segundo lhe permite retomar as transferências interrompidas:

  • rsync -azP source destination
Outputsending incremental file list ./ file1            0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101) file10            0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101) file100            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101) file11            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101) . . . 

Se executarmos o comando novamente, teremos um resultado mais curto, pois nenhuma alteração foi feita. Isso ilustra a capacidade do rsync de usar horários de modificação para determinar se alterações foram feitas.

  • rsync -azP source destination
Outputsending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00 

Podemos atualizar o horário de modificação em alguns arquivos e ver que o rsync copia novamente de maneira inteligente apenas os arquivos alterados:

  • touch dir1/file{1..10}
  • rsync -azP source destination
Outputsending incremental file list file1             0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101) file10             0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101) file2             0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101) file3             0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101) . . . 

Para manter dois diretórios realmente sincronizados, é necessário excluir arquivos do diretório de destino caso eles sejam removidos da fonte. Por padrão, o rsync não exclui nada do diretório de destino.

Podemos alterar esse comportamento com a opção --delete. Antes de usar essa opção, use a opção --dry-run e faça testes para impedir a perda de dados:

  • rsync -a --delete source destination

Se quiser excluir certos arquivos ou diretórios localizados dentro de um diretório que você está sincronizando, faça isso os especificando em uma lista separada por vírgulas após a opção --exclude=:

  • rsync -a --exclude=pattern_to_exclude source destination

Se especificarmos um padrão para excluir, podemos sobrescrever essa exclusão para arquivos que correspondam a um padrão diferente usando a opção --include=.

  • rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

Por fim, a opção –--backup do rsync pode ser usada para armazenar backups de arquivos importantes. Ela é usada em conjunto com a opção --backup-dir, que especifica o diretório onde os arquivos de backup devem ser armazenados.

  • rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

Conclusão

O Rsync pode simplificar as transferências de arquivos em conexões de rede e adicionar robustez à sincronização de diretórios locais. A flexibilidade do rsync faz com que ele seja uma boa opção para muitas operações de nível de arquivos diferentes.

O domínio do rsync permite projetar operações de backup complexas e ganhar controle refinado sobre o que é transferido e a forma como isso é feito.