URL: https://www.progressiverobot.com/how-to-use-rsync-to-sync-local-and-remote-directories-pt/

Introdução

O *Rsync*, que significa "sincronização remota", é uma ferramenta de sincronização remota e local. Ele usa um algoritmo que minimiza a quantidade de dados copiados ao mover apenas as porções de arquivos que foram alteradas.

Neste guia, iremos abordar o uso básico deste utilitário poderoso.

O que é o Rsync?

rsync illustration for: O que é o Rsync?

O Rsync é uma ferramenta de sincronização habilitada em rede muito. Devido à sua onipresença em sistemas Linux e do tipo Unix, além da sua popularidade como uma ferramenta para scripts de sistema, ela é incluída na maioria das distribuições Linux por padrão.

Sintaxe básica

A sintaxe básica do rsync é bastante simples e opera de uma maneira semelhante ao ssh, scp e cp.

Vamos criar dois diretórios de teste e alguns arquivos de teste com os seguintes comandos:

				
					
cd ~

mkdir dir1

mkdir dir2

touch dir1/file{1..100}

				
			

Agora, temos um diretório chamado dir1 contendo 100 arquivos vazios.

				
					
ls dir1

				
			
				
					
[secondary_label Output]

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

				
			

Também temos um diretório vazio chamado dir2.

Para sincronizar o conteúdo de dir1 em dir2 no mesmo sistema, digite:

				
					
rsync -r dir1/ dir2

				
			

A opção -r significa recursivo, que é necessário para a sincronização de diretórios.

Também poderíamos usar o sinalizador -a como alternativa:

				
					
rsync -a dir1/ dir2

				
			

A opção -a é um sinalizador de combinação. Ela representa "arquivo" e sincroniza recursivamente e preserva links simbólicos, arquivos especiais e de dispositivo, horários de modificação, grupo, proprietário e permissões. Ela é mais comumente usada do que -r e geralmente é o que você vai desejar usar.

Uma nota importante

Você pode ter notado que existe uma barra à direita (/) no final do primeiro argumento nos comandos acima:

				
					
rsync -a dir1<^>/<^> dir2

				
			

Isso é necessário e significa "o conteúdo de dir1". A alternativa, sem a barra à direita, colocaria o dir1, incluindo o diretório, dentro do dir2. Isso criaria uma hierarquia como esta:

				
					
~/dir2/dir1/[files]

				
			

Sempre verifique duas vezes seus argumentos antes de executar um comando rsync. O Rsync fornece um método para fazer isso passando as opções -n ou --dry-run. O sinalizador -v (para verboso, prolixo) também é necessário para obter o resultado apropriado:

				
					
rsync -anv dir1/ dir2

				
			
				
					
[secondary_label Output]

sending incremental file list

./

file1

file10

file100

file11

file12

file13

file14

file15

file16

file17

file18

. . .

				
			

Compare esse resultado com o resultado que obtemos ao remover a barra à direita:

				
					
rsync -anv dir1 dir2

				
			
				
					
[secondary_label 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

. . .

				
			

Você pode ver aqui que o diretório em si foi transferido.

Como usar o Rsync para sincronizar com um sistema remoto

Sincronizar com um sistema remoto é trivial se você possuir acesso SSH à máquina remota e o rsync instalado em ambos os lados. Depois de ter o acesso SSH verificado entre as duas máquinas, sincronize a pasta dir1 de antes com um computador remoto usando esta sintaxe (observe que _queremos_ transferir o diretório real neste caso, então omitimos a barra à direita):

				
					
rsync -a ~/dir1 <^>username<^>@<^>remote_host<^>:<^>destination_directory<^>

				
			

Isso é chamado de uma operação "push", pois empurra um diretório do sistema local para um sistema remoto. A operação oposta é "pull". Ela é usada para sincronizar um diretório remoto com o sistema local. Se o dir1 estivesse no sistema remoto em vez de no nosso sistema local, a sintaxe seria:

				
					
rsync -a <^>username<^>@<^>remote_host<^>:<^>/home/username/dir1<^> <^>place_to_sync_on_local_machine<^>

				
			

Assim como cp e ferramentas similares, a fonte é sempre o primeiro argumento, e o destino é sempre o segundo.

Opções úteis para o Rsync

O Rsync oferece muitas opções para alterar o comportamento padrão do utilitário. Já discutimos alguns dos sinalizadores mais necessários.

Se estiver transferindo arquivos que ainda não foram comprimidos, como arquivos de texto, você pode reduzir a transferência de rede adicionando compressão com a opção -z:

				
					
rsync -az <^>source<^> <^>destination<^>

				
			

O sinalizador -P é muito útil. Ele combina os sinalizadores --progress e --partial. O primeiro deles lhe dá uma barra de progresso para as transferências e o segundo lhe permite retomar as transferências interrompidas:

				
					
rsync -azP <^>source<^> <^>destination<^>

				
			
				
					
[secondary_label 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)

. . .

				
			

Se executarmos o comando novamente, teremos um resultado mais curto, pois nenhuma alteração foi feita. Isso ilustra a capacidade do rsync de usar horários de modificação para determinar se alterações foram feitas.

				
					
rsync -azP <^>source<^> <^>destination<^>

				
			
				
					
[secondary_label Output]

sending incremental file list

sent 818 bytes received 12 bytes 1660.00 bytes/sec

total size is 0 speedup is 0.00

				
			

Podemos atualizar o horário de modificação em alguns arquivos e ver que o rsync copia novamente de maneira inteligente apenas os arquivos alterados:

				
					
touch dir1/file{1..10}

rsync -azP <^>source<^> <^>destination<^>

				
			
				
					
[secondary_label 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)

file2

            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)

file3

            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)

. . .

				
			

Para manter dois diretórios realmente sincronizados, é necessário excluir arquivos do diretório de destino caso eles sejam removidos da fonte. Por padrão, o rsync não exclui nada do diretório de destino.

Podemos alterar esse comportamento com a opção --delete. Antes de usar essa opção, use a opção --dry-run e faça testes para impedir a perda de dados:

				
					
rsync -a --delete <^>source<^> <^>destination<^>

				
			

Se quiser excluir certos arquivos ou diretórios localizados dentro de um diretório que você está sincronizando, faça isso os especificando em uma lista separada por vírgulas após a opção --exclude=:

				
					
rsync -a --exclude=<^>pattern_to_exclude<^> <^>source<^> <^>destination<^>

				
			

Se especificarmos um padrão para excluir, podemos sobrescrever essa exclusão para arquivos que correspondam a um padrão diferente usando a opção --include=.

				
					
rsync -a --exclude=<^>pattern_to_exclude<^> --include=<^>pattern_to_include<^> <^>source<^> <^>destination<^>

				
			

Por fim, a opção –--backup do rsync pode ser usada para armazenar backups de arquivos importantes. Ela é usada em conjunto com a opção --backup-dir, que especifica o diretório onde os arquivos de backup devem ser armazenados.

				
					
rsync -a --delete --backup --backup-dir=<^>/path/to/backups<^> <^>/path/to/source<^> <^>destination<^>

				
			

Conclusão

O Rsync pode simplificar as transferências de arquivos em conexões de rede e adicionar robustez à sincronização de diretórios locais. A flexibilidade do rsync faz com que ele seja uma boa opção para muitas operações de nível de arquivos diferentes.

O domínio do rsync permite projetar operações de backup complexas e ganhar controle refinado sobre o que é transferido e a forma como isso é feito.