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 remotos e locais. Ele utiliza um algoritmo para minimizar a quantidade de dados copiados, movendo apenas as partes dos arquivos que foram alteradas.

Neste tutorial, vamos definir o Rsync, revisar a sintaxe ao usar rsync, explicar como usar o Rsync para sincronizar com um sistema remoto e outras opções disponíveis para você.

Implante suas aplicações frontend do GitHub usando a Plataforma de Aplicativos da DigitalOcean. Deixe a DigitalOcean focar em escalar seu aplicativo.

Pré-requisitos

Para praticar o uso do rsync para sincronizar arquivos entre um sistema local e remoto, você precisará de duas máquinas para atuar como seu computador local e sua máquina remota, respectivamente. Essas duas máquinas podem ser servidores virtuais privados, máquinas virtuais, contêineres ou computadores pessoais, desde que estejam devidamente configuradas.

Se você planeja seguir este guia usando servidores, seria prudente configurá-los com usuários administrativos e configurar um firewall em cada um deles. Para configurar esses servidores, siga nosso Guia de Configuração Inicial do Servidor.

Independentemente dos tipos de máquinas que você usa para seguir este tutorial, você precisará ter criado chaves SSH em ambos. Em seguida, copie a chave pública de cada servidor para o arquivo authorized_keys do outro servidor, conforme descrito no Passo 2 desse guia.

Este guia foi validado em máquinas rodando Ubuntu 20.04, embora deva funcionar geralmente com qualquer computador executando um sistema operacional baseado em Linux que tenha o rsync instalado.

Definindo Rsync

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

Entendendo a Sintaxe do Rsync

A sintaxe para rsync opera de forma semelhante a outras ferramentas, como ssh, scp e cp.

Primeiro, mude para o seu diretório pessoal executando o seguinte comando:

  1. cd ~

Em seguida, crie um diretório de teste:

  1. mkdir dir1

Crie outro diretório de teste:

  1. mkdir dir2

Agora adicione alguns arquivos de teste:

  1. touch dir1/file{1..100}

Agora existe um diretório chamado dir1 com 100 arquivos vazios nele. Confirme listando os arquivos:

  1. 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

Você também possui um diretório vazio chamado dir2. Para sincronizar o conteúdo de dir1 para dir2 no mesmo sistema, você executará rsync e usará a opção -r, que significa “recursivo” e é necessário para sincronização de diretórios:

  1. rsync -r dir1/ dir2

Outra opção é usar a opção -a, que é uma combinação de opções e significa “arquivo”. Esta opção sincroniza de forma recursiva e preserva links simbólicos, arquivos especiais e de dispositivo, horários de modificação, grupos, proprietários e permissões. É mais comumente usada do que -r e é a opção recomendada para uso. Execute o mesmo comando do exemplo anterior, desta vez usando a opção -a:

  1. rsync -a dir1/ dir2

Por favor, note que há uma barra final (/) no final do primeiro argumento na sintaxe dos dois comandos anteriores e destacados aqui:

  1. rsync -a dir1/ dir2

Esta barra final significa o conteúdo de dir1. Sem a barra final, dir1, incluindo o diretório, seria colocado dentro de dir2. O resultado criaria uma hierarquia como a seguinte:

~/dir2/dir1/[files]

Outra dica é verificar seus argumentos antes de executar um comando rsync. Rsync fornece um método para fazer isso passando as opções -n ou --dry-run. A flag -v, que significa “verbose”, também é necessária para obter a saída apropriada. Você vai combinar as flags a, n e v no seguinte comando:

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

Agora compare essa saída com a que você recebe ao remover a barra final, como no seguinte:

  1. 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 . . .

Agora essa saída demonstra que o próprio diretório foi transferido, em vez de apenas os arquivos dentro do diretório.

Usando Rsync para Sincronizar com um Sistema Remoto

Para usar o rsync para sincronizar com um sistema remoto, você só precisa de acesso SSH configurado entre suas máquinas local e remota, além do rsync instalado em ambos os sistemas. Depois de verificar o acesso SSH entre as duas máquinas, você pode sincronizar a pasta dir1 da seção anterior para uma máquina remota usando a seguinte sintaxe. Por favor, note neste caso que você deseja transferir o diretório real, então você omitirá a barra final:

  1. rsync -a ~/dir1 username@remote_host:destination_directory

Este processo é chamado de operação de push porque “empurra” um diretório do sistema local para um sistema remoto. A operação oposta é pull, e é usada para sincronizar um diretório remoto com o sistema local. Se o diretório dir1 estivesse no sistema remoto em vez do seu sistema local, a sintaxe seria a seguinte:

  1. rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

Como cp e ferramentas similares, a origem é sempre o primeiro argumento, e o destino é sempre o segundo.

Usando Outras Opções do Rsync

O Rsync fornece muitas opções para alterar o comportamento padrão da utilidade, como as opções de bandeira que você aprendeu na seção anterior.

Se você 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:

  1. rsync -az source destination

A bandeira -P também é útil. Ela combina as bandeiras --progress e --partial. A primeira bandeira fornece uma barra de progresso para as transferências, e a segunda bandeira permite que você retome transferências interrompidas:

  1. rsync -azP source destination
Output
sending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .

Se você executar o comando novamente, receberá uma saída reduzida, já que nenhuma alteração foi feita. Isso ilustra a capacidade do Rsync de usar os horários de modificação para determinar se foram feitas alterações:

  1. 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

Digamos que você atualizasse o horário de modificação de alguns dos arquivos com um comando como o seguinte:

  1. touch dir1/file{1..10}

Em seguida, se você executar rsync com -azP novamente, você notará na saída como o Rsync inteligentemente recopia apenas os arquivos alterados.

  1. 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 verdadeiramente sincronizados, é necessário excluir arquivos do diretório de destino se eles forem removidos do origem. Por padrão, rsync não exclui nada do diretório de destino.

Você pode alterar esse comportamento com a opção --delete. Antes de usar esta opção, você pode usar -n, a opção --dry-run, para fazer um teste e evitar perda indesejada de dados.

  1. rsync -an --delete source destination

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

  1. rsync -a --exclude=pattern_to_exclude source destination

Se você tem um padrão específico para excluir, você pode substituir essa exclusão para arquivos que correspondem a um padrão diferente usando a opção --include=.

  1. 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.

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

Conclusão

O Rsync pode otimizar transferências de arquivos sobre conexões em rede e adicionar robustez à sincronização de diretórios locais. A flexibilidade do Rsync o torna uma boa opção para muitas operações diferentes em nível de arquivo.

A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories