O rsync é uma fer­ra­menta versátil que sim­pli­fica a trans­fe­rên­cia de ficheiros através de ligações de rede e acelera a sin­cro­ni­za­ção de di­re­tó­rios locais. A sua grande fle­xi­bi­li­dade torna esta fer­ra­menta de sin­cro­ni­za­ção numa excelente opção para uma grande variedade de operações com ficheiros.

O que é o rsync?

O rsync, abre­vi­a­tura de «remote syn­ch­ro­ni­sa­tion» (sin­cro­ni­za­ção remota), é uma fer­ra­menta de sin­cro­ni­za­ção flexível e com­pa­tí­vel com redes no Linux. Este programa de código aberto pode ser utilizado para sin­cro­ni­zar ficheiros e pastas entre sistemas locais ou através de redes. A fer­ra­menta utiliza uma técnica de trans­fe­rên­cia di­fe­ren­cial de dados, na qual apenas são trans­fe­ri­das as secções de dados que realmente foram alteradas. Isto minimiza a troca de dados e acelera con­si­de­ra­vel­mente o processo de sin­cro­ni­za­ção. Graças a uma grande variedade de opções, o rsync permite controlar com precisão o com­por­ta­mento da sin­cro­ni­za­ção. A sintaxe flexível permite tanto cópias locais simples como sin­cro­ni­za­ções de rede complexas.

A sintaxe do rsync

A sintaxe dos comandos do rsync tem uma estrutura simples e é se­me­lhante à do SSH, SCP e CP. A estrutura básica é a seguinte:

rsync [OPTION] source destination
bash

O caminho de origem a partir do qual os dados serão sin­cro­ni­za­dos é in­tro­du­zido no parâmetro source, enquanto o caminho de destino é in­tro­du­zido no parâmetro destination. Para tal, o rsync oferece uma variedade de opções que permitem adaptar o processo de sin­cro­ni­za­ção às ne­ces­si­da­des es­pe­cí­fi­cas. As opções mais uti­li­za­das são:

  • -a (Archive): mantém re­cur­si­va­mente as per­mis­sões dos ficheiros, os registos de data e hora, os grupos, os pro­pri­e­tá­rios e as pro­pri­e­da­des especiais dos ficheiros.
  • -v (Verbose): mostra in­for­ma­ções de­ta­lha­das sobre o processo de sin­cro­ni­za­ção.
  • -r (Recursivo): sin­cro­niza os di­re­tó­rios e o seu conteúdo de forma recursiva.
  • -u (Update): transfere apenas os ficheiros mais recentes do que os que se encontram no diretório de destino.
  • -z (Compress): reduz o tráfego de dados através da rede.
  • -n –itemize-changes: apresenta uma lista das al­te­ra­ções a realizar.
  • --delete: elimina ficheiros do diretório de destino que já não existem na origem.
  • --exclude: exclui de­ter­mi­na­dos ficheiros ou di­re­tó­rios da sin­cro­ni­za­ção.
  • --dry-run: simula o processo de sin­cro­ni­za­ção sem trans­fe­rir os ficheiros.
  • --progress: mostra o progresso da trans­fe­rên­cia de ficheiros.
  • --partial: os ficheiros que foram par­ci­al­mente trans­fe­ri­dos per­ma­ne­cem no diretório de destino se a trans­fe­rên­cia for in­ter­rom­pida. Quando a trans­fe­rên­cia é retomada, o ficheiro continua a partir do seu último estado.

Exemplo de sintaxe do rsync

A sintaxe do rsync pode ser fa­cil­mente com­pre­en­dida com um exemplo. O comando seguinte cria o diretório dir1 com cem ficheiros de teste vazios e um segundo diretório vazio, dir2:

$ cd ~
$ mkdir dir1
$ mkdir dir2
$ touch dir1/file{1..100}
bash

O conteúdo de dir1 pode ser sin­cro­ni­zado no mesmo sistema com dir2 uti­li­zando a opção -r:

$ rsync -r dir1/ dir2
bash

Em al­ter­na­tiva, pode utilizar-se a opção -a, que sin­cro­niza re­cur­si­va­mente e inclui ligações sim­bó­li­cas, ficheiros de dis­po­si­ti­vos especiais, datas de mo­di­fi­ca­ção, grupos, pro­pri­e­tá­rios e per­mis­sões:

$ rsync -a dir1/ dir2
bash

Nota. A barra (/) no final do diretório de origem num comando rsync é im­por­tante porque indica que se deve sin­cro­ni­zar o conteúdo do diretório, e não o próprio diretório.

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

Sem a barra final no diretório de origem, o conteúdo do diretório de origem é copiado para o diretório de destino:

$ rsync -a 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
. . .
bash

Na prática, portanto, faz sentido utilizar a barra no final do diretório de origem para garantir que o processo de sin­cro­ni­za­ção decorra conforme o esperado e que o conteúdo do diretório de origem seja cor­re­ta­mente trans­fe­rido para o diretório de destino.

rsync: sin­cro­ni­za­ção com um sistema remoto

Sin­cro­ni­zar um sistema remoto com o rsync não costuma ser difícil, desde que se tenha acesso SSH ao com­pu­ta­dor remoto e se conheçam os dados de au­ten­ti­ca­ção ne­ces­sá­rios. O rsync costuma utilizar o SSH (Secure Shell) para uma co­mu­ni­ca­ção segura com sistemas remotos. A fer­ra­menta também deve estar instalada em ambos os lados.

Se for ve­ri­fi­cado o acesso SSH entre os dois com­pu­ta­do­res, é possível sin­cro­ni­zar a pasta dir1 num com­pu­ta­dor remoto. Neste caso, será trans­fe­rido o diretório real, pelo que se omite a barra final no comando seguinte:

$ rsync -a ~/dir1 username@remote_host:destination_directory
bash

Quando se transfere um diretório de um sistema local para um sistema remoto, fala-se de uma operação «push». Por outro lado, quando se sin­cro­niza um diretório remoto com um sistema local, fala-se de uma operação «pull». A sintaxe é a seguinte:

$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
bash

Uti­li­za­ção de outras opções no rsync

O com­por­ta­mento padrão do rsync pode ser ainda mais per­so­na­li­zado uti­li­zando as opções apre­sen­ta­das an­te­ri­or­mente.

Trans­fe­rên­cia de ficheiros não com­pac­ta­dos com o rsync

A carga da rede ao trans­fe­rir ficheiros não com­pri­mi­dos pode ser reduzida da seguinte forma, uti­li­zando a opção -z:

$ rsync -az source destination
bash

Vi­su­a­li­zar o progresso e retomar as trans­mis­sões in­ter­rom­pi­das

Com -P, pode combinar as opções --progress e --partial. Isto dá-lhe uma visão geral do andamento das trans­fe­rên­cias e permite-lhe retomar as trans­fe­rên­cias in­ter­rom­pi­das ao mesmo tempo:

$ 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)
file100
    0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101)
file11
    0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101)
. . .
bash

Execute o comando novamente para obter um resultado mais conciso. Isto permite ao rsync de­ter­mi­nar se foram feitas al­te­ra­ções com base nos tempos de mo­di­fi­ca­ção.

$ 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
bash

Manter os di­re­tó­rios sin­cro­ni­za­dos com o rsync

Para garantir que dois di­re­tó­rios per­ma­ne­çam realmente sin­cro­ni­za­dos, é ne­ces­sá­rio eliminar do diretório de destino os ficheiros que foram removidos do diretório de origem. Por pre­de­fi­ni­ção, no entanto, o rsync não elimina nenhum ficheiro do diretório de destino. Este com­por­ta­mento pode ser alterado com a opção --delete. No entanto, é acon­se­lhá­vel utilizar esta opção com precaução, uma vez que elimina do diretório de destino os ficheiros que já não existem no diretório de origem.

Antes de utilizar esta opção, deve utilizar a opção --dry-run. Isto permite-lhe simular o processo de sin­cro­ni­za­ção sem apagar os ficheiros reais. Desta forma, garante que apenas são efetuadas as al­te­ra­ções pre­ten­di­das, sem perder aci­den­tal­mente dados im­por­tan­tes:

$ rsync -a --delete source destination
bash

Excluir ficheiros e pastas da sin­cro­ni­za­ção com o rsync

No rsync, pode utilizar a opção --exlude para excluir de­ter­mi­na­dos ficheiros e di­re­tó­rios da sin­cro­ni­za­ção. Isto é útil se, por exemplo, ficheiros tem­po­rá­rios, ficheiros de registo ou outros conteúdos não devessem ser sin­cro­ni­za­dos.

$ rsync -a --exclude=pattern_to_exclude source destination
bash

Se tiver es­pe­ci­fi­cado um padrão para excluir ficheiros, pode subs­ti­tuir essa exclusão para os ficheiros que cor­res­pon­dam a um padrão diferente, uti­li­zando a opção --include=.

$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
bash

Fazer cópias de segurança com o rsync

A opção --backup permite guardar cópias de segurança de ficheiros im­por­tan­tes. É utilizada em conjunto com a opção --backup-dir. Esta opção es­pe­ci­fica o diretório onde os ficheiros de cópia de segurança serão guardados:

$ rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
bash

En­con­trará uma descrição detalhada dos di­fe­ren­tes cenários de cópia de segurança no nosso artigo«Criar cópias de segurança do servidor com o rsync».

Ir para o menu principal