Uso do comando rsync para sincronizar arquivos e diretórios [11 Examples]

O rsync é uma ferramenta de linha de comando gratuita que permite sincronizar arquivos local e remotamente. Com ele, você pode transferir arquivos e diretórios.

Isso o torna muito útil para migrar dados, realizar backups e espelhar, tornando-o ótimo para webmasters e administradores para tarefas recorrentes de transferência de dados.

Este artigo nos ensinará como o Rysnc funciona e fornecerá alguns exemplos úteis.

Como funciona o rsync?

rsync é um utilitário de linha de comando de sincronização remota para sistemas do tipo Unix. Dá ao usuário a capacidade de transferir/sincronizar arquivos entre máquinas ou dois hosts sem problemas.

Nos bastidores, o rsync usa o algoritmo delta-transfer. Esse algoritmo envolve a cópia de diferenças entre os dois arquivos em dois hosts (origem e destino). A origem e o destino podem ser locais ou remotos. O comando rsync pode executar tarefas de dados de cópia/sincronização de duas maneiras. Estes são:

  • Use ssh, rsh para copiar/sincronizar entre dois hosts.
  • Use o daemon TCP rsync para copiar/sincronizar.

Como foi projetado para funcionar em sistemas semelhantes ao Unix, também funciona no Linux.

O processo passo a passo que o rsync usa da seguinte maneira:

  • O Rsync usa SSH para se conectar ao host remoto e solicita uma senha.
  • Uma vez conectado, o rsync do host remoto se comunica com a fonte.
  • Esses programas determinarão os arquivos e diretórios que precisam ser sincronizados. Ele usa um algoritmo de transferência delta para verificar a diferença entre os arquivos.

Se o comando rsync não encontrar um arquivo no controle remoto, mas não no host, ele o copiará e o transferirá para o sistema host. Da mesma forma, para arquivos já existentes (tanto no host quanto no remoto), ele copiará a diferença entre eles (ou seja, partes alteradas). Por fim, ele ignorará os arquivos existentes em ambos os sistemas sem modificações.

O comando rsync obtém atualizações incrementais armazenando a diferença em um arquivo temporário antes de enviá-lo ao destino.

Antes que você comece:

  • Você precisa ter privilégios de root ou sudo
  • Ter acesso ao terminal/linha de comando
  • Acesso SSH para execução segura de comandos rsync
  • Você também precisa de duas máquinas para fazer o rsync.

Para o tutorial, vamos usar o Linux Mint 21.1 Vera. Você pode seguir facilmente o guia sem problemas usando qualquer outra distribuição Linux.

Por que usar rsync sobre Scp?

Scp (cópia segura) é um protocolo de linha de comando popular que permite aos usuários copiar arquivos. Segue uma abordagem linear para copiar. Isso significa que ele simplesmente copia os arquivos da origem para o destino. Para fazer isso com segurança, ele usa SSH.

A sintaxe do comando scp é a seguinte:

scp option SOURCE DESTINATION

No entanto, a questão permanece: por que usar rsync sobre scp?

Bem, há vários benefícios em usar o rsync. Esses benefícios incluem:

  • Execução mais rápida: rsync é mais rápido que scp porque usa um protocolo de atualização remota. Isso permite que ele transfira apenas diferenças em vez de todo o arquivo. Portanto, se você configurar uma sincronização regular ao longo do tempo, precisará fazer apenas uma cópia completa na primeira vez. A partir da próxima vez, ele copia apenas as partes atualizadas com a ajuda do algoritmo de transferência delta.
  • Menos consumo de largura de banda: como o rsync não precisa copiar o arquivo inteiro novamente, isso leva a um menor consumo de largura de banda. Além disso, também usa algoritmos de compactação/descompactação para minimizar o tamanho do arquivo durante a transferência.
  • Mais opções de linha de comando: o rsync também supera o scp no número de opções de linha de comando. Isso significa que você pode ajustar o rsync mais do que o scp.
  9 Bibliotecas de componentes de grade de dados JavaScript para usar

Concluindo, o rsync é uma excelente ferramenta de sincronização incremental. A ferramenta scp também é útil para transferir/sincronizar arquivos com segurança. Em um cenário do mundo real, o scp é adequado para tarefas do dia a dia se você estiver procurando por uma abordagem mais direta. No entanto, para tarefas recorrentes, use rsync.

Sintaxe do comando rsync

O comando rsync é o seguinte:

Aqui, os termos são definidos abaixo:

  • OPTION – Estas são as opções de rsync
  • SOURCE – Diretório de origem
  • DEST – Diretório de destino
  • USER – nome de usuário remoto
  • HOST – nome de host remoto ou endereço IP

As opções são parâmetros que oferecem funcionalidade adicional ao comando. Por exemplo, você pode sincronizar dados recursivamente com a opção -r. No entanto, a opção -r não sincroniza a propriedade de grupos e usuários, carimbos de data/hora, permissão ou links simbólicos. Em vez disso, você pode usar a opção -a, que executa o comando no modo de arquivo, garantindo que todas as propriedades, permissões e links simbólicos do arquivo sejam mantidos durante a cópia.

Outras opções de rsync incluem:

  • -z: compacta dados para economizar espaço
  • -h: fornece saída em formato legível por humanos
  • -b: executa backup durante o processo de sincronização de dados
  • -e: usa o protocolo SSH para transferências remotas de dados
  • -progress: exibe o progresso da sincronização de dados
  • -v: peça ao rsync para exibir a saída detalhada
  • –n: executa um teste para testar as configurações e configuração para sincronização de dados
  • -q: suprime a saída e as opções do comando rsync

Instalando o rsync

A maioria dos sistemas Unix e Linux vem com o rsync instalado. Se o seu sistema não tiver rsync, você pode instalá-lo usando o(s) seguinte(s) comando(s).

Para Debian/Ubuntu e Mint

sudo apt-get install rsync

Para Arch Linux

pacman -S rsync

No Gentoo

emerge sys-apps/rsync

No CentOS/Fedora/REHL

sudo yum install rsync

No openSUSE

sudo zypper install rsync

Como temos o Linux Mint, o rsync veio pré-instalado. Então você pode executar o comando rsync no terminal para ver se ele está instalado. Ele explicará seus recursos, opções e outras informações vitais, se estiverem presentes.

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.

Vamos agora ver o rsync em ação com diferentes casos de uso.

Para o tutorial, vamos criar dois diretórios.

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

Para isso, você precisa digitar os seguintes comandos.

mkdir source-directory
mkdir dest-directory

Além disso, precisaremos gerar arquivos para fazer o rsync funcionar. Então vamos criar alguns arquivos de teste com o comando abaixo.

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

Isso cria 100 arquivos vazios no diretório de origem. Você pode confirmá-lo digitando 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

Nota: Mantivemos o diretório dest vazio.

  Como executar a redefinição do Harmony Hub

Copiar diretórios localmente recursivamente

Embora o rsync tenha como objetivo principal copiar arquivos entre um servidor local e remoto, é igualmente útil para copiar arquivos localmente.

Nesse caso, usaremos a seguinte sintaxe rsync.

opção rsync ORIGEM DESTINO

Copie os arquivos em nosso diretório de origem para o diretório de destino executando o seguinte comando.

rsync -r source-directory/ dest-directory

Aqui, o comando “recursivamente” copia 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.

Copiar arquivo único localmente

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

Para isso, editaremos o arquivo vazio file1 no diretório-fonte e o sincronizaremos com o mesmo arquivo presente no diretório-destino.

Para editar um arquivo, digite o seguinte comando.

nano source-directory/file1

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

Adicionando conteúdo a um arquivo

Agora, feche e salve o arquivo.

Vamos agora copiar o arquivo usando 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
$ 

Como você deve ter notado, usamos a opção –existing. Isso atualiza os arquivos existentes. Se você executar o comando sem –existing, ele não será atualizado, mesmo que seja executado com sucesso.

Se o único arquivo que você está copiando não existir na pasta de destino, você precisará executar 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

Copiando Vários Arquivos

Se você pretende copiar vários arquivos, deve mencionar os caminhos de origem de ambos 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 fazer isso.

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

Agora, use o seguinte comando para sincronizar vários 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
$ 

Copiar arquivo ou diretório do local para o remoto

A sintaxe rsync para transferência local para remota é a seguinte.

rsync option SOURCE [email protected]:DEST

Como você pode ver, você precisa saber o endereço IP da máquina remota para fazer isso funcionar. Além disso, você precisa 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 iniciar a transferência, ele pedirá a senha. Digite-o para continuar. Além disso, se o usuário for diferente na máquina remota, você precisará mencioná-lo antes do endereço IP seguido de @.

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

Se você pretende copiar vários arquivos ou diretórios, precisará listar os arquivos ou caminhos de diretório. A sintaxe para isso está abaixo.

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 de transferência remota

O rsync permite especificar protocolos de transferência de arquivos específicos. Para fazer isso, você precisa usar a opção -e, seguida do protocolo.

  Verifique o comprimento da lista em Python em 3 etapas fáceis

Por exemplo, se quiser usar o protocolo ssh, você deve anexar -e ssh ao comando rsync.

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

Copiando um arquivo ou diretório de remoto para local

A sintaxe rsync para transferência local para remota é a seguinte.

sync option [email protected]:SRC DEST

Isso funciona como uma solicitação pull. Portanto, para obter os arquivos/diretório necessários de um servidor remoto para sua máquina local, você precisa executar o seguinte comando.

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

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

Da mesma forma, você pode obter um arquivo específico mencionando-o por meio de seu caminho completo.

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

Para copiar vários arquivos ou diretórios de local para remoto, você precisa especificar o caminho entre colchetes (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.

Mostrar progresso ao vivo durante a transferência

É uma boa ideia ver o progresso ao vivo para backups de dados maiores. Para isso, você precisa usar o sinalizador –progress. Anexe-o ao comando rsync e você poderá ver a velocidade de 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

Excluir arquivos de origem assim que a transferência for concluída

Você pode usar o sinalizador -remove-source-files para remover os arquivos de origem após a transferência completa. Isso pode ajudá-lo em muitos cenários, especialmente quando se trata de proteger seus arquivos sem deixar vestígios ou simplesmente usá-los para liberar espaço.

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

teste de rsync

O Rysnc também permite que você avalie antes de fazer uma execução real. A simulação permite que você veja se está fazendo a coisa certa. Afinal, você não deseja atualizar arquivos por engano ou até excluí-los.

Você precisa usar a opção –dry-run para fazer uma simulação. Adicione-o ao comando, seguido da origem e do 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 a executamos antes. No entanto, você notará uma menção de (DRY RUN) no final da saída.

Definir o tamanho mínimo e máximo do arquivo

O Rysnc também permite definir o tamanho mínimo ou máximo do arquivo durante a transferência.

Então, se você deseja transferir com um tamanho mínimo de 15KB, você precisa usar –min-size=15K.

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

O comando copiará apenas arquivos com tamanho mínimo de arquivo de 15 KB. Se o tamanho do arquivo estiver abaixo, ele irá ignorá-lo.

Da mesma forma, você pode usar o sinalizador –max-size para definir o tamanho máximo do arquivo.

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

Aqui, o rsync irá ignorar arquivos acima do tamanho de 450K.

Definir limite de largura de banda

Se você estiver executando outras tarefas com uso intensivo de largura de banda, poderá definir rysnc para definir o limite de largura de banda para a transferência. Para fazer isso, use o –bwlimit=KB/s.

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

Aqui, definimos a largura de banda para 100Kb/s durante a transferência.

Palavras Finais

Isso nos leva ao final do nosso guia de comando rsync. Aprendemos a usar o rysnc e abordamos muitos comandos de maneira eficaz.

No entanto, o rysnc oferece muito mais do que cobrimos. É por isso que você também pode consultar a página de manual do rsync, onde todos os aspectos do rsync são abordados.

Em seguida, confira as folhas de dicas da linha de comando para Windows, Linux e macOS.