Como usar Rsync para sincronizar diretórios locais e remotos

Introdução

Rsync, que significa “sincronização remota”, é uma ferramenta de sincronização de arquivos remota e local. Ela usa um algoritmo que minimiza a quantidade de dados copiados movendo apenas as porções de arquivos que mudaram.

Neste guia, vamos cobrir o uso básico deste poderoso utilitário.

O que é Rsync?

Rsync é uma ferramenta de sincronização muito flexível, habilitada para rede. Devido à sua ubiquidade em sistemas Linux e similares ao Unix e sua popularidade como ferramenta para scripts de sistema, ele é incluído na maioria das distribuições Linux por padrão.

Sintaxe Básica

A sintaxe básica de rsync é muito simples, e opera de uma forma similar 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}

Temos agora um diretório chamado dir1 com 100 arquivos vazios nele.

  • ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90file10 file19 file28 file37 file46 file55 file64 file73 file82 file91file100 file2 file29 file38 file47 file56 file65 file74 file83 file92file11 file20 file3 file39 file48 file57 file66 file75 file84 file93file12 file21 file30 file4 file49 file58 file67 file76 file85 file94file13 file22 file31 file40 file5 file59 file68 file77 file86 file95file14 file23 file32 file41 file50 file6 file69 file78 file87 file96file15 file24 file33 file42 file51 file60 file7 file79 file88 file97file16 file25 file34 file43 file52 file61 file70 file8 file89 file98file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

Temos também um directório vazio chamado dir2.

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

  • rsync -r dir1/ dir2

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

Podemos também usar a bandeira -a em vez disso:

  • rsync -a dir1/ dir2

A opção -a é uma bandeira de combinação. Ela significa “archive” e sincroniza recursivamente e preserva links simbólicos, arquivos especiais e de dispositivos, tempos de modificação, grupo, dono e permissões. É mais comumente usado que -r e é normalmente o que você quer usar.

Uma nota importante

Você deve ter notado que há uma barra de travessão (/) no final do primeiro argumento nos comandos acima:

  • rsync -a dir1/ dir2

Isso é necessário para significar “o conteúdo de dir1“. A alternativa, sem a barra deslizante, colocaria dir1, incluindo o diretório, dentro de dir2. Isto criaria uma hierarquia que se parece com:

  • ~/dir2/dir1/

Verifiquem sempre os argumentos antes de executar um comando rsync. Rsync fornece um método para fazer isso passando as opções -n ou --dry-run. O flag -v (para verbose) também é necessário para obter a saída apropriada:

  • rsync -anv dir1/ dir2
Output
sending incremental file list./file1file10file100file11file12file13file14file15file16file17file18. . .

Compare esta saída com a saída que obtemos quando removemos a barra móvel:

  • rsync -anv dir1 dir2
Output
sending incremental file listdir1/dir1/file1dir1/file10dir1/file100dir1/file11dir1/file12dir1/file13dir1/file14dir1/file15dir1/file16dir1/file17dir1/file18. . .

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

Como usar o Rsync para sincronizar com um sistema remoto

Syncing para um sistema remoto é trivial se você tiver acesso SSH à máquina remota e rsync instalado em ambos os lados. Uma vez que você tenha acesso SSH verificado entre as duas máquinas, você pode sincronizar a pasta dir1 de antes para um computador remoto usando esta sintaxe (note que nós queremos transferir o diretório real neste caso, então nós omitimos a barra de deslocamento):

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

Isto é chamado de operação “push” porque empurra um diretório do sistema local para um sistema remoto. A operação oposta é “pull” (puxar). Ela é usada para sincronizar um diretório remoto para o sistema local. Se o dir1 estivesse no sistema remoto ao invés do nosso sistema local, a sintaxe seria:

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

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

Opções úteis para Rsync

Rsync fornece muitas opções para alterar o comportamento padrão do utilitário. Já discutimos algumas das flags mais necessárias.

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

  • rsync -az source destination

A flag -P é muito útil. Ela combina as bandeiras --progress e --partial. A primeira delas dá uma barra de progresso para as transferências e a segunda 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 output mais curto, porque não foram feitas alterações. Isto ilustra a capacidade do rsync de usar tempos de modificação para determinar se as alterações foram feitas.

  • rsync -azP source destination
Output
sending incremental file listsent 818 bytes received 12 bytes 1660.00 bytes/sectotal size is 0 speedup is 0.00

Podemos atualizar o tempo de modificação em alguns dos arquivos e ver que o rsync recopia inteligentemente apenas os arquivos alterados:

  • touch dir1/file{1..10}
  • rsync -azP source destination
Output
sending incremental file listfile1 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 se eles forem removidos da fonte. Por padrão, o rsync não exclui nada do diretório de destino.

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

  • rsync -a --delete source destination

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

  • rsync -a --exclude=pattern_to_exclude source destination

Se nós especificamos um padrão para excluir, nós podemos sobrepor essa exclusão para arquivos que correspondem a um padrão diferente, usando a opção --include=.

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

Finalmente, a opção do rsync --backup pode ser usada para armazenar backups de arquivos importantes. Ele é usado 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

Conclusion

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

Um domínio do rsync permite que você projete operações de backup complexas e obtenha um controle fino sobre o que é transferido e como.

Deixe uma resposta

O seu endereço de email não será publicado.