Como sincronizar dados com rsync
rsync é uma ferramenta versátil, que facilita a transferência de arquivos por conexões de rede e acelera a sincronização de diretórios locais. Devido à alta flexibilidade deste software, ele passou a ser uma excelente opção para uma vasta gama de operações envolvendo arquivos.
O que é rsync?
rsync (abreviação de remote synchronization) é uma ferramenta de sincronização de software livre para Linux, de grande flexibilidade e compatível com diferentes redes. Com esse programa de código aberto, você se torna capaz de sincronizar arquivos e diretórios entre sistemas locais ou por uma rede. Para que isso seja possível, a ferramenta utiliza a técnica de transferência de dados diferencial, em que apenas os trechos realmente alterados dos arquivos são transferidos. Isso minimiza a troca de dados e acelera muito o processo de sincronização. Graças a sua grande variedade de opções, o rsync também possibilita o controle preciso do comportamento das sincronizações. Além disso, a sintaxe da ferramenta permite a realização tanto de cópias locais simples quanto de sincronizações complexas por uma rede.
Sintaxe do rsync
A sintaxe de comandos rsync é simples e se assemelha à sintaxe do SSH, do SCP e do CP. Comando rsync devem ter a seguinte estrutura básica:
rsync [OPTION] source destination
bashsource
especifica o caminho de origem a partir do qual os dados deverão ser sincronizados, enquanto destination
indica o caminho de destino. Ainda, o rsync oferece diversas opções para a configuração de processos de sincronização, de acordo com necessidades individuais. Estas são algumas das opções mais populares:
-
-a
(Archive): Preserva, recursivamente, permissões de arquivos, carimbos de data e hora, grupos, proprietários e propriedades especiais de arquivos. -
-v
(Verbose): Exibe informações detalhadas sobre o processo de sincronização. -
-r
(Recursive): Sincroniza diretórios e seus conteúdos de modo recursivo. -
-u
(Update): Transfere apenas os arquivos mais novos que os já existentes no diretório de destino. -
-z
(Compress): Reduz o tráfego de dados da rede. -
-n
–itemize-changes: Exibe lista contendo as alterações a serem realizadas. -
--delete
: Apaga, no diretório de destino, arquivos que não existem mais no diretório de origem. -
--exclude
: Exclui certos arquivos ou diretórios da sincronização. -
--dry-run
: Simula um processo de sincronização, sem realmente transferir arquivos. -
--progress
: Exibe o progresso da transferência de arquivos. -
--partial
: Arquivos parcialmente transferidos permanecem no diretório de destino, caso a transferência seja interrompida. Durante uma nova transferência, a transferência interrompida é retomada a partir do último estado destes arquivos.
Exemplo de sintaxe rsync
Observe este exemplo prático. Ele lhe ajudará a compreender a sintaxe do rsync. No comando a seguir, criamos o diretório dir1
e incluímos nele 100 arquivos de teste vazios. Também criamos um segundo diretório vazio, de nome dir2
:
$ cd ~
$ mkdir dir1
$ mkdir dir2
$ touch dir1/file{1..100}
bashCom a opção -r
, o conteúdo de dir1
pode ser sincronizado com o dir2
, desde que no mesmo sistema:
$ rsync -r dir1/ dir2
bashComo alternativa, você pode usar a opção -a
. Ela faz uma sincronização recursiva e ainda inclui links simbólicos, arquivos especiais de dispositivos, datas/horas das alterações, grupos, proprietários e permissões de arquivos:
$ rsync -a dir1/ dir2
bashAtenção: A barra (/
) ao final do diretório de origem, em um comando rsync, é importante. Ela indica que o conteúdo do diretório deve ser sincronizado, e não o diretório em si.
$ rsync -a dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
bashSe você não adicionar a barra após o diretório de origem, o próprio diretório de origem será 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
. . .
bashPortanto, na prática, é recomendável usar a barra no fim do diretório de origem, para garantir que o processo de sincronização corra como esperado e que o conteúdo do diretório de origem seja corretamente transferido ao diretório de destino.
rsync para sincronização com sistemas remotos
De modo geral, realizar sincronizações remotas com rsync não é complicado, desde que você tenha acesso SSH ao computador remoto e que possua as credenciais de autenticação necessárias. Além disso, a ferramenta precisa estar instalada em ambos os lados para que a transferência seja possível. O rsync frequentemente usa o protocolo SSH (Secure Shell) para estabelecer comunicações seguras com sistemas remotos.
Após a verificação do acesso SSH entre os dois computadores, a pasta dir1
poderá ser sincronizada para um computador remoto. Nesse caso, o diretório em si deverá ser transferido. Por isso, a barra após o nome do diretório não será incluída no comando.
$ rsync -a ~/dir1 username@remote_host:destination_directory
bashQuando um diretório é transferido de um sistema local para um sistema remoto, nos referimos ao processo como operação push. Em contraste, usamos o termo operação pull para nos referirmos a um diretório remoto sincronizado com um sistema local. Em ambas as situações, a sintaxe deve ter o seguinte formato:
$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
bashHospedagem VPS poderosa e de baixo custo para rodar suas aplicações sob medida, com assistente pessoal e suporte 24 horas.
- Armazenamento 100% SSD
- Pronto em 55 segundos
- Certificado SSL
Outras opções do rsync
Com as opções que apresentaremos agora, você conseguirá personalizar ainda mais o comportamento das transferências e sincronizações que realizará pelo rsync.
Transferir arquivos não compactados com rsync
Ao transferir arquivos não compactados, você poderá reduzir a carga da rede fazendo uso da opção -z
:
$ rsync -az source destination
bashExibir progresso e retomar transferências interrompidas com rsync
Com a indicação -P
, você pode combinar as opções --progress
e `–partial para obter um resumo do progresso das transferências e, ao mesmo tempo, retomar possíveis transferências interrompidas:
$ 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)
. . .
bashExecute o comando novamente para obter uma saída mais curta. Desse modo, você estará usando o rsync para descobrir se alterações foram feitas. Carimbos de data e hora apontarão essas alterações.
$ 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
bashManter diretórios sincronizados com rsync
Para garantir que dois diretórios estejam sempre sincronizados, você deverá deletar, no diretório de destino, arquivos que foram removidos do diretório de origem — por padrão, o rsync não remove nenhum arquivo do diretório de destino. Modifique essa configuração com a opção --delete
. Atenção: utilize essa opção com cuidado, pois ela apaga, no diretório de destino, todos os arquivos que não existem mais no diretório de origem.
Antes de empregar essa opção, aconselhamos que você faça uso da opção --dry-run
, que realizará uma simulação do processo de sincronização sem deletar os arquivos de fato. Assim, você garantirá que só serão feitas as alterações desejadas e que seus dados importantes não serão descartados por acidente.
$ rsync -a --delete source destination
bashExcluir arquivos e diretórios da sincronização com rsync
No rsync, a opção --exclude
possibilita excluir da sincronização certos arquivos e diretórios. Isso é útil, por exemplo, se você não deseja sincronizar arquivos temporários, arquivos de log e conteúdos similares.
$ rsync -a --exclude=pattern_to_exclude source destination
bashAlém de especificar um padrão para a exclusão dos arquivos, você ainda poderá incluir arquivos que correspondam a outro padrão, com a opção --include=
:
$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
bashFazer backups com rsync
Com a opção --backup
, você poderá fazer backups dos seus arquivos importantes. Ela costuma ser utilizada em combinação com --backup-dir
, que indica o diretório onde os arquivos de backup deverão ser salvos:
$ rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
bashNo nosso artigo sobre backups em servidores com rsync, você encontra informações mais aprofundadas a respeito de cenários de backup.