Domine o Rsync: Sincronize Arquivos com Eficiência!

Sincronização de Arquivos Eficiente com Rsync: Um Guia Completo

O rsync é um utilitário de linha de comando, disponível gratuitamente, que possibilita a sincronização de arquivos tanto em âmbito local quanto remoto. Com ele, é possível realizar a transferência de arquivos e diretórios de forma ágil e eficaz.

Essa capacidade torna o rsync uma ferramenta indispensável para diversas finalidades, como migração de dados, criação de backups e espelhamento de informações. Webmasters e administradores de sistemas se beneficiam grandemente do rsync para automatizar tarefas rotineiras de transferência de dados.

Neste artigo, exploraremos o funcionamento do rsync, detalhando seu mecanismo de operação e apresentando exemplos práticos de seu uso.

Como o Rsync Opera?

O rsync é uma ferramenta de sincronização remota utilizada em sistemas operacionais baseados em Unix. Ele concede aos usuários a capacidade de transferir e sincronizar arquivos entre máquinas distintas, ou entre dois hosts, de maneira simples e eficaz.

Internamente, o rsync emprega o algoritmo de “transferência delta”. Este algoritmo se encarrega de copiar apenas as diferenças entre os arquivos existentes em dois hosts (origem e destino). Tanto a origem quanto o destino podem ser locais ou remotos. O comando rsync pode executar tarefas de cópia e sincronização de dados de duas formas:

  • Utilizando ssh ou rsh para a cópia e sincronização entre dois hosts.
  • Utilizando o daemon TCP rsync para realizar a cópia e sincronização.

Por ter sido concebido para operar em sistemas Unix-like, o rsync é totalmente compatível com o sistema operacional Linux.

O processo de funcionamento do rsync é executado da seguinte maneira:

  • O rsync se conecta ao host remoto por meio de SSH, solicitando a senha de acesso.
  • Uma vez conectado, o rsync do host remoto estabelece comunicação com a origem dos dados.
  • Os programas envolvidos identificam os arquivos e diretórios que precisam ser sincronizados, utilizando um algoritmo de transferência delta para detectar as diferenças.

Se o rsync identificar um arquivo no remoto que não esteja presente no host local, ele copiará esse arquivo para o sistema host. De forma similar, para arquivos que já existem em ambos os sistemas, ele copiará apenas as partes modificadas, ignorando arquivos idênticos em ambos os locais. O rsync armazena as diferenças em um arquivo temporário antes de enviá-lo ao destino, permitindo atualizações incrementais.

Antes de começar, você precisa:

  • Possuir privilégios de root ou sudo.
  • Ter acesso ao terminal ou linha de comando.
  • Ter acesso SSH para a execução segura dos comandos rsync.
  • Dispor de duas máquinas para realizar a sincronização.

Para fins de demonstração, utilizaremos o Linux Mint 21.1 Vera. No entanto, este guia pode ser seguido sem problemas em qualquer outra distribuição Linux.

Rsync vs. Scp: Por Que Escolher Rsync?

O scp (cópia segura) é um protocolo popular de linha de comando que possibilita a cópia de arquivos de um local para outro. Ele utiliza uma abordagem linear, ou seja, copia os arquivos da origem para o destino, utilizando o SSH para garantir a segurança da transferência.

A sintaxe básica do comando scp é a seguinte:

scp opção ORIGEM DESTINO

Surge, então, a pergunta: por que optar pelo rsync em vez do scp?

O rsync apresenta diversas vantagens em relação ao scp. Entre elas, destacam-se:

  • Maior Velocidade: O rsync se destaca pela sua velocidade superior ao scp, devido à utilização de um protocolo de atualização remota. Este protocolo transfere apenas as diferenças entre os arquivos, em vez de todo o arquivo, como o scp. Assim, após uma primeira cópia completa, as sincronizações subsequentes se tornam muito mais rápidas.
  • Menor Consumo de Largura de Banda: Como o rsync não precisa copiar o arquivo inteiro repetidamente, o consumo de largura de banda é significativamente menor. Além disso, ele emprega algoritmos de compressão/descompressão para reduzir ainda mais o tamanho dos arquivos durante a transferência.
  • Mais Opções de Linha de Comando: O rsync oferece um conjunto maior de opções de linha de comando do que o scp, proporcionando maior flexibilidade e personalização da ferramenta.

Em suma, o rsync é uma ferramenta excepcional para sincronizações incrementais. O scp também é útil para transferir e sincronizar arquivos de forma segura, sendo adequado para tarefas mais simples do dia a dia. No entanto, para tarefas recorrentes, o rsync se mostra a opção mais eficiente.

Sintaxe do Comando Rsync

A sintaxe básica do comando rsync é a seguinte:

rsync [OPÇÃO] ORIGEM DESTINO

Onde:

  • OPÇÃO – Parâmetros que modificam o comportamento do rsync.
  • ORIGEM – Diretório ou arquivo de origem.
  • DESTINO – Diretório ou arquivo de destino.
  • USUÁRIO – Nome de usuário remoto (para transferência remota).
  • HOST – Nome de host remoto ou endereço IP (para transferência remota).

As opções são parâmetros que expandem a funcionalidade do comando. Por exemplo, a opção -r permite sincronizar recursivamente os dados. No entanto, essa opção não sincroniza propriedades como grupos de usuários, timestamps, permissões ou links simbólicos. Para isso, usa-se a opção -a, que opera no modo de arquivo, preservando todas as propriedades e permissões durante a cópia.

Outras opções comuns do rsync incluem:

  • -z: Comprime os dados para economizar espaço.
  • -h: Exibe a saída em formato legível para humanos.
  • -b: Realiza backups durante o processo de sincronização de dados.
  • -e: Utiliza o protocolo SSH para transferências remotas de dados.
  • --progress: Exibe o progresso da sincronização de dados.
  • -v: Solicita que o rsync exiba uma saída detalhada.
  • --n: Executa um teste para avaliar as configurações da sincronização.
  • -q: Suprime a saída e as opções do comando rsync.

Instalação do Rsync

A maioria dos sistemas Unix e Linux já vem com o rsync instalado. Caso ele não esteja presente em seu sistema, você pode instalá-lo utilizando os seguintes comandos.

Para Debian/Ubuntu e Mint:

sudo apt-get install rsync

Para Arch Linux:

pacman -S rsync

Para Gentoo:

emerge sys-apps/rsync

Para CentOS/Fedora/REHL:

sudo yum install rsync

Para openSUSE:

sudo zypper install rsync

No Linux Mint, o rsync já vem pré-instalado. Para verificar se ele está instalado, execute o comando rsync no terminal. Ele exibirá informações sobre suas funcionalidades, opções e outras informações relevantes.

nitt ~
$ rsync
rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.
  

A seguir, veremos exemplos práticos de uso do rsync em diferentes cenários.

Para fins didáticos, criaremos dois diretórios:

  • diretório-fonte
  • diretório de destino

Para isso, execute os seguintes comandos:

mkdir source-directory
mkdir dest-directory

Também precisaremos de alguns arquivos para testar o rsync. Vamos criar alguns arquivos de teste utilizando o comando abaixo:

touch source-directory/file{1..100}

Isso cria 100 arquivos vazios no diretório de origem. Para confirmar, execute o comando abaixo:

ls source-directory
  Output:
nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
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
  

Note que mantivemos o diretório dest-directory vazio.

Cópia Recursiva de Diretórios Localmente

Embora o rsync seja frequentemente utilizado para a cópia de arquivos entre servidores locais e remotos, ele também é muito útil para a cópia de arquivos localmente.

Nesse caso, utilizaremos a seguinte sintaxe do rsync:

rsync opção ORIGEM DESTINO

Para copiar os arquivos de nosso diretório de origem para o diretório de destino, execute o seguinte comando:

rsync -r source-directory/ dest-directory

O comando acima copia recursivamente todos os arquivos do diretório de origem para o diretório de destino.

nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
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
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
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
  

Como se pode observar, todos os arquivos do diretório de origem foram copiados para o diretório de destino.

Cópia de um Único Arquivo Localmente

Agora que aprendemos a sincronizar diretórios, aprenderemos a copiar um único arquivo.

Para isso, editaremos o arquivo vazio file1 no diretório source-directory e o sincronizaremos com o mesmo arquivo existente no diretório dest-directory.

Para editar um arquivo, execute o seguinte comando:

nano source-directory/file1

Copie e cole o texto a seguir no editor nano:

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.
    

Após adicionar o conteúdo, feche e salve o arquivo.

Vamos agora copiar o arquivo usando o rsync:

sudo rsync -v --existing source-directory/file1 /dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80

nitt rsync-tutorial
$
  

Note que utilizamos a opção --existing. Essa opção garante a atualização dos arquivos existentes. Se você executar o comando sem essa opção, o arquivo não será atualizado, mesmo que o comando seja executado com sucesso.

Caso o arquivo que você está copiando não exista no diretório de destino, execute o seguinte comando:

rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

Cópia de Vários Arquivos

Para copiar vários arquivos, é necessário especificar os caminhos de origem de todos os arquivos, seguidos do diretório de destino.

Para isso, criaremos dois novos arquivos, newfile2 e newfile3, no diretório source. Execute o seguinte comando para criá-los:

touch source-directory/newfile{2..3}

Agora, utilize o seguinte comando para sincronizar múltiplos arquivos:

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00
nitt rsync-tutorial
$
    

Cópia de Arquivos ou Diretórios do Local para o Remoto

A sintaxe do rsync para transferências do local para o remoto é a seguinte:

rsync option ORIGEM [email protected]:DEST

Para que a transferência funcione, é necessário conhecer o endereço IP da máquina remota e adicioná-lo após o arquivo de origem.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Antes de iniciar a transferência, você deverá fornecer a senha de acesso. Além disso, caso o usuário seja diferente na máquina remota, é necessário especificá-lo antes do endereço IP, seguido por @.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Para copiar vários arquivos ou diretórios, é necessário listar os arquivos ou os caminhos dos diretórios. A sintaxe para essa operação é:

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Protocolos Específicos para Transferências Remotas

O rsync permite que você especifique protocolos de transferência de arquivos específicos. Para isso, use a opção -e, seguida do protocolo desejado.

Por exemplo, para utilizar o protocolo ssh, adicione -e ssh ao comando rsync:

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Cópia de Arquivos ou Diretórios do Remoto para o Local

A sintaxe do rsync para transferências do remoto para o local é a seguinte:

rsync option [email protected]:SRC DEST

Esse comando funciona como uma solicitação “pull”. Para obter os arquivos ou diretórios desejados de um servidor remoto para a sua máquina local, execute o seguinte comando:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

O comando acima extrai os arquivos do diretório de destino na máquina remota para o diretório de origem na máquina local.

De forma similar, você pode obter um arquivo específico mencionando o seu caminho completo:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Para copiar múltiplos arquivos ou diretórios do local para o remoto, você precisa especificar o caminho entre chaves (separados por vírgulas) após o endereço IP do servidor:

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

De forma similar, você também pode especificar arquivos.

Exibir o Progresso em Tempo Real Durante a Transferência

É altamente recomendável acompanhar o progresso em tempo real durante backups de dados extensos. Para isso, utilize a opção --progress. Ao adicioná-la ao comando rsync, você poderá monitorar a velocidade da transferência, o tempo restante e a quantidade de dados já transferidos.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Excluir Arquivos de Origem Após a Conclusão da Transferência

Você pode utilizar a opção --remove-source-files para remover os arquivos de origem após a transferência ser finalizada. Essa função é útil em diversas situações, principalmente quando se trata de proteger seus arquivos sem deixar rastros ou simplesmente para liberar espaço.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Teste do Rsync (Dry Run)

O rsync também permite que você realize uma avaliação prévia antes de efetuar a execução real do comando. Essa simulação possibilita verificar se você está fazendo a operação correta. Afinal, o objetivo é evitar a atualização de arquivos por engano ou, até mesmo, a exclusão deles.

Para realizar essa simulação, utilize a opção --dry-run. Adicione-a ao comando, seguida pela origem e pelo destino:

sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)
nitt rsync-tutorial
  

A saída é semelhante à forma como executamos anteriormente. No entanto, observe que a menção (DRY RUN) aparece no final da saída.

Definição do Tamanho Mínimo e Máximo de Arquivo

O rsync também permite que você especifique o tamanho mínimo ou máximo dos arquivos que serão transferidos.

Se você deseja transferir apenas arquivos com tamanho mínimo de 15KB, utilize a opção --min-size=15k.

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

O comando acima copiará apenas arquivos com tamanho mínimo de 15 KB. Arquivos menores serão ignorados.

De forma similar, você pode usar a opção --max-size para definir o tamanho máximo dos arquivos:

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Neste caso, o rsync irá ignorar arquivos com tamanho superior a 450 KB.

Definição do Limite de Largura de Banda

Se você estiver executando outras tarefas que exigem muita largura de banda, pode configurar o rsync para limitar a largura de banda utilizada pela transferência. Para isso, utilize a opção --bwlimit=KB/s.

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Neste exemplo, definimos a largura de banda para 100 KB/s durante a transferência.

Considerações Finais

Chegamos ao final deste guia sobre o comando rsync. Aprendemos a utilizar essa ferramenta e exploramos diversos comandos de forma prática e eficiente.

O rsync oferece um vasto leque de recursos além dos que abordamos neste artigo. Para se aprofundar ainda mais, consulte a página de manual do rsync, onde todos os aspectos da ferramenta são explorados em detalhes.

Recomendamos também que você consulte outros guias de referência de linha de comando para Windows, Linux e macOS.