Tutorial

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

Linux BasicsBackups

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
Output
file1 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
Output
sending 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
Output
sending 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):

  • rsync -a ~/dir1 username@remote_host:destination_directory

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:

  • rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

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
Output
sending 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
Output
sending 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
Output
sending 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.

Creative Commons License