Introdução
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 front-end do GitHub usando a Plataforma de Aplicativos DigitalOcean. Deixe a DigitalOcean se concentrar em dimensionar 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 privados virtuais, máquinas virtuais, contêineres ou computadores pessoais, desde que estejam devidamente configurados.
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 do tipo de máquinas que você usa para seguir este tutorial, você precisará ter criado chaves SSH em ambas. 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 executando Ubuntu 20.04, embora deva funcionar geralmente com qualquer computador executando um sistema operacional baseado em Linux que tenha 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, ela está incluída 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:
Em seguida, crie um diretório de teste:
Crie outro diretório de teste:
Agora adicione alguns arquivos de teste:
Agora existe um diretório chamado dir1
com 100 arquivos vazios dentro dele. Confirme listando os arquivos:
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
Você também tem um diretório vazio chamado dir2
. Para sincronizar o conteúdo de dir1
com dir2
no mesmo sistema, você executará o rsync
e usará o sinalizador -r
, que significa “recursivo” e é necessário para a sincronização de diretórios:
Outra opção é usar o sinalizador -a
, que é um sinalizador de combinação e significa “arquivo”. Este sinalizador sincroniza de forma recursiva e preserva links simbólicos, arquivos especiais e de dispositivos, tempos de modificação, grupos, proprietários e permissões. É mais comumente usado do que -r
e é o sinalizador recomendado para usar. Execute o mesmo comando do exemplo anterior, desta vez usando o sinalizador -a
:
Por favor, note que há uma barra final (/
) ao final do primeiro argumento na sintaxe dos dois comandos anteriores e destacada aqui:
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 novamente seus argumentos antes de executar um comando rsync
. O Rsync oferece um método para fazer isso passando as opções -n
ou --dry-run
. A bandeira -v
, que significa “verbose”, também é necessária para obter a saída apropriada. Você combinará as bandeiras a
, n
e v
no seguinte comando:
Outputsending 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:
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
. . .
Agora esta saída demonstra que o próprio diretório foi transferido, em vez de apenas os arquivos dentro do diretório.
Usando o 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 que, neste caso, você deseja transferir o diretório real, então você omitirá a barra final:
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:
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 sinalizador 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
:
O sinalizador -P
também é útil. Ele combina os sinalizadores --progress
e --partial
. Este primeiro sinalizador fornece uma barra de progresso para as transferências, e o segundo sinalizador permite retomar transferências interrompidas:
Outputsending 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, pois nenhuma alteração foi feita. Isso ilustra a capacidade do Rsync de usar horários de modificação para determinar se foram feitas alterações:
Outputsending 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 em alguns dos arquivos com um comando como o seguinte:
Então, se você executar rsync
com -azP
novamente, você notará na saída como o Rsync inteligentemente recopia apenas os arquivos alterados:
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 verdadeiramente sincronizados, é necessário excluir arquivos do diretório de destino se eles forem removidos da 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 essa opção, você pode usar -n
, a opção --dry-run
, para realizar um teste e evitar perda de dados indesejada:
Se preferir excluir certos 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=
:
Se você tiver um padrão específico para excluir, pode substituir essa exclusão para arquivos que correspondam a um padrão diferente usando a opção --include=
:
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:
Conclusão
O Rsync pode otimizar transferências de arquivos por conexões de 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.