Domine o Rsync: Guia Completo com 11 Exemplos Práticos

Sincronização Eficiente com Rsync: Um Guia Completo

O Rsync é uma ferramenta de linha de comando robusta e gratuita, projetada para a sincronização de arquivos tanto em nível local quanto remoto. Através dela, é possível transferir arquivos e diretórios de forma eficaz, tornando-a uma solução valiosa para diversas tarefas.

Sua capacidade de migrar dados, realizar backups e espelhamento a torna indispensável para administradores de sistemas e webmasters que lidam com transferências de dados recorrentes.

Este artigo detalhará o funcionamento do Rsync, apresentando exemplos práticos e úteis para o seu dia a dia.

Como o Rsync Opera?

O Rsync é um utilitário de sincronização remota, ideal para sistemas tipo Unix. Ele permite a transferência e sincronização de arquivos entre máquinas ou hosts sem dificuldades. A ferramenta emprega o algoritmo de transferência delta, que otimiza o processo de cópia ao focar nas diferenças entre os arquivos em dois locais (origem e destino). A origem e o destino podem ser locais ou remotos. As tarefas de cópia e sincronização são realizadas de duas maneiras:

  • Utilizando SSH ou RSH para sincronização entre dois hosts.
  • Empregando o daemon TCP Rsync para sincronização.

Por ter sido desenvolvido para sistemas Unix, o Rsync também opera perfeitamente em ambientes Linux.

O funcionamento do Rsync segue os seguintes passos:

  • O Rsync se conecta ao host remoto via SSH e requer a senha do usuário.
  • Após a conexão, o Rsync do host remoto se comunica com a fonte.
  • Ambos os programas identificam os arquivos e diretórios que necessitam ser sincronizados, usando um algoritmo delta para analisar as diferenças entre os arquivos.

Se o comando Rsync encontrar um arquivo no host remoto que não exista no host local, ele o copiará. Se o arquivo já existir em ambos, apenas as partes alteradas (diferenças) serão copiadas. Arquivos idênticos em ambos os sistemas serão ignorados. O Rsync realiza atualizações incrementais, armazenando as diferenças em um arquivo temporário antes de transferi-lo ao destino.

Antes de começar, certifique-se de:

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

Neste guia, utilizaremos o Linux Mint 21.1 Vera, mas você pode adaptar o tutorial para qualquer outra distribuição Linux.

Rsync vs. Scp: Qual a Melhor Opção?

O Scp (Secure Copy) é um protocolo de linha de comando amplamente utilizado para a cópia de arquivos, seguindo uma abordagem linear de cópia direta da origem para o destino através do SSH.

A sintaxe do comando scp é:

scp [opções] ORIGEM DESTINO

Mas, por que preferir o Rsync ao Scp?

Existem diversas vantagens em usar o Rsync, incluindo:

  • Velocidade de Execução: O Rsync é mais rápido que o Scp por utilizar um protocolo de atualização remota, que transfere apenas as diferenças entre os arquivos. Isso significa que, após uma primeira cópia completa, as cópias seguintes serão muito mais rápidas, pois apenas as partes modificadas serão transferidas.
  • 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 utiliza algoritmos de compressão/descompressão para reduzir o tamanho dos arquivos durante a transferência.
  • Mais Opções de Linha de Comando: O Rsync oferece um leque maior de opções de linha de comando, permitindo ajustes mais finos em seu comportamento.

Em resumo, o Rsync é uma excelente ferramenta de sincronização incremental, enquanto o Scp é uma opção válida para transferências e sincronizações mais diretas. Em cenários do dia a dia, o Scp pode ser suficiente, mas o Rsync se destaca em tarefas recorrentes e otimização de transferência de dados.

Sintaxe do Comando Rsync

O formato básico do comando Rsync é:

rsync [opções] ORIGEM DESTINO

Onde:

  • OPÇÃO: Define as opções do Rsync.
  • ORIGEM: Especifica o diretório de origem.
  • DESTINO: Determina o diretório de destino.
  • USUÁRIO: Indica o nome de usuário remoto.
  • HOST: É o nome do host remoto ou endereço IP.

As opções são parâmetros que adicionam funcionalidades ao comando. Por exemplo, a opção -r possibilita a sincronização recursiva de diretórios. Contudo, -r não sincroniza propriedades de grupos, usuários, carimbos de data/hora ou links simbólicos. Para isso, a opção -a executa o comando no modo de arquivo, preservando todas as propriedades e permissões.

Outras opções do Rsync incluem:

  • -z: Compacta os dados para economizar espaço.
  • -h: Apresenta resultados em formato legível.
  • -b: Realiza backups durante a sincronização.
  • -e: Utiliza o protocolo SSH para transferências remotas.
  • –progress: Exibe o progresso da sincronização.
  • -v: Aumenta a verbosidade da saída.
  • –n: Executa um teste simulado da sincronização.
  • -q: Suprime a saída e as opções do comando.

Instalação do Rsync

O Rsync geralmente já vem instalado em sistemas Unix e Linux. Se não estiver presente, você pode instalá-lo através dos 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

Como estamos utilizando o Linux Mint, o Rsync já está instalado. Para verificar sua instalação, execute o comando “rsync” no terminal. Ele exibirá informações sobre seus recursos, opções e outras funcionalidades.

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.

Agora, vamos explorar o Rsync em ação com diversos exemplos práticos.

Para este tutorial, criaremos dois diretórios:

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

Para criá-los, utilize os seguintes comandos:

mkdir source-directory
mkdir dest-directory

Além disso, vamos gerar arquivos para demonstrar o Rsync. Criaremos alguns arquivos de teste com o comando abaixo:

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

Isso criará 100 arquivos vazios dentro do diretório “source-directory”. Para confirmar, utilize o comando abaixo:

ls source-directory

Saída:

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

Apesar do Rsync ser frequentemente utilizado para transferir arquivos entre servidores locais e remotos, ele também pode ser usado localmente para copiar arquivos e diretórios.

Nesse cenário, utilizaremos a seguinte sintaxe do Rsync:

rsync [opções] ORIGEM DESTINO

Para copiar os arquivos do diretório de origem para o diretório de destino, utilize o comando a seguir:

rsync -r source-directory/ dest-directory

Aqui, a opção “-r” instrui o comando a copiar 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

Isso copia todos os arquivos do diretório de origem para o diretório de destino.

Cópia de um Único Arquivo Localmente

Além da sincronização de diretórios, o Rsync permite copiar arquivos individuais. Para demonstrar isso, editaremos o arquivo vazio “file1” no diretório “source-directory” e o sincronizaremos com o mesmo arquivo presente no diretório “dest-directory”.

Para editar o arquivo, execute:

nano source-directory/file1

Copie e cole o seguinte texto 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.

Agora, salve e feche o arquivo.

Para copiar o arquivo utilizando o Rsync, utilize:

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
$ 

Observe que utilizamos a opção “–existing”, que atualiza apenas os arquivos já existentes. Se executar o comando sem esta opção, o arquivo não será atualizado, mesmo que o comando seja executado com sucesso.

Se o arquivo que você deseja copiar não existir no diretório de destino, utilize 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 Múltiplos Arquivos

Para copiar vários arquivos, especifique os caminhos de origem de cada arquivo, seguidos pelo diretório de destino.

Vamos criar dois novos arquivos: “newfile2” e “newfile3” no diretório “source-directory”. Use o seguinte comando:

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

Agora, use o seguinte comando para sincronizar os 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/Diretórios do Local para Remoto

A sintaxe do Rsync para transferência do local para o remoto é:

rsync [opções] ORIGEM [email protected]:DESTINO

Para que isso funcione, você precisa conhecer o endereço IP da máquina remota. Além disso, você deve adicionar o endereço IP após o arquivo de origem.

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

Antes de começar a transferência, o sistema pedirá a senha. Digite-a para prosseguir. Se o usuário na máquina remota for diferente, especifique-o antes do endereço IP seguido por “@”.

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

Para copiar múltiplos arquivos ou diretórios, liste os arquivos ou caminhos. A sintaxe é:

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

Protocolos de Transferência Remota

O Rsync permite especificar protocolos de transferência de arquivos. Utilize a opção “-e” seguida pelo protocolo.

Por exemplo, para usar 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/Diretórios do Remoto para Local

A sintaxe do Rsync para transferências do remoto para o local é:

rsync [opções] [email protected]:ORIGEM DESTINO

Este comando funciona como uma solicitação “pull”. Para obter arquivos de um servidor remoto, utilize:

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

O comando extrai arquivos do diretório “dest-directory” na máquina remota para o diretório “source-directory” na máquina local.

Para obter um arquivo específico, especifique 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, especifique 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

Da mesma forma, você também pode mencionar arquivos.

Exibição do Progresso da Transferência em Tempo Real

Para monitorar o progresso de backups de dados maiores, utilize o sinalizador “–progress”. Ao anexá-lo ao comando Rsync, você acompanhará a velocidade da transferência, o tempo restante e a quantidade de dados transferidos.

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

Exclusão de Arquivos de Origem Após a Transferência

Você pode usar o sinalizador “–remove-source-files” para excluir os arquivos de origem após a conclusão da transferência, o que pode ser útil em diversos cenários, como proteger arquivos ou liberar espaço.

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

Execução de Teste do Rsync

O Rsync oferece a possibilidade de realizar um teste simulado antes da execução real, permitindo que você verifique se tudo está configurado corretamente. Isso evita atualizações ou exclusões acidentais de arquivos.

Para executar um teste simulado, use a opção “–dry-run”, adicionando-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 será semelhante à execução normal, mas com a menção “(DRY RUN)” ao final.

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

O Rsync possibilita definir um tamanho mínimo ou máximo de arquivo durante a transferência.

Para transferir arquivos com um tamanho mínimo de 15KB, use “–min-size=15k”:

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

Apenas arquivos com tamanho mínimo de 15KB serão copiados. Arquivos menores serão ignorados.

Para definir o tamanho máximo, utilize o sinalizador “–max-size”:

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

O Rsync irá ignorar arquivos com tamanho acima de 450KB.

Definição do Limite de Largura de Banda

Se estiver executando outras tarefas que consomem largura de banda, você pode definir um limite para a transferência do Rsync, utilizando 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

Aqui, a largura de banda foi limitada a 100Kb/s durante a transferência.

Considerações Finais

Este guia abrangente sobre o comando Rsync demonstrou seu funcionamento e explorou diversos casos de uso. O Rsync oferece muito mais funcionalidades do que as apresentadas aqui. Consulte a página de manual do Rsync para obter informações detalhadas.

Além disso, confira também as folhas de dicas da linha de comando para Windows, Linux e macOS, caso precise.