Comando rsync: sincronizar e fazer backups no Linux

Terminal com o comando rsync -avz em destaque, a ilustrar a sincronização e as cópias de segurança no Linux

Há uma diferença enorme entre copiar ficheiros e sincronizá-los. Um cp -r copia tudo de novo, sempre; o rsync compara a origem com o destino e transfere apenas o que mudou. Está por trás de incontáveis backups e espelhos — e vale a pena conhecê-lo a fundo: um rsync bem escrito é rápido e fiável; um mal escrito apaga um backup inteiro em segundos.

Este artigo acompanha o guia em vídeo e segue a ordem em que vai usar as opções: a barra final, o modo arquivo, o ensaio a seco, o --delete e as suas redes de segurança, os filtros, o transporte por SSH e as opções que fazem do rsync um motor de backups incrementais. No fim, pode experimentar tudo num simulador interativo.

Veja o guia em vídeo

Prefere ver antes de experimentar? No canal HJFR-IT no YouTube mostramos o rsync opção a opção, com o resultado de cada comando no ecrã — narrado em português e com legendas.

rsync — Guia Completo: sincronização rápida e backups no Linux — canal HJFR-IT no YouTube. Se o áudio não arrancar em português, abra as definições do vídeo (ícone da roda dentada) → Faixa de áudio → Português.

O que faz o rsync

O rsync sincroniza ficheiros entre duas pastas da mesma máquina ou, por SSH, entre máquinas diferentes. Para decidir o que transferir, usa por omissão o quick check: se o tamanho e a data de modificação coincidem nos dois lados, salta o ficheiro. Nos que mudaram, o algoritmo delta envia só os blocos diferentes (em cópias locais envia o ficheiro inteiro, que é mais rápido).

rsync [OPÇÕES] ORIGEM DESTINO
rsync [OPÇÕES] ORIGEM utilizador@servidor:CAMINHO    # enviar
rsync [OPÇÕES] utilizador@servidor:CAMINHO DESTINO   # puxar

A barra final: a regra que toda a gente erra

Com uma barra no fim da origem, o rsync copia o conteúdo da pasta para dentro do destino; sem barra, copia a própria pasta, criando um nível a mais. É a causa número um de cópias no sítio errado.

rsync -av projeto/ backup/   # backup/index.html...
rsync -av projeto  backup/   # backup/projeto/index.html...

Decore assim: barra no fim significa «o conteúdo de»; sem barra, «a pasta». No destino, a barra é indiferente. A regra vale também para caminhos remotos (utilizador@servidor:caminho), e o rsync funciona nos dois sentidos: empurra para o servidor ou puxa dele — por exemplo, para restaurar um backup.

Archive, verbose e progresso

  • -a (archive) — atalho para -rlptgoD: recursivo (-r) e a preservar ligações simbólicas, permissões, datas, dono e grupo. É o modo certo para cópias fiéis. Só com -r, as datas perdem-se e a execução seguinte volta a copiar tudo.
  • -v (verbose) — lista os ficheiros à medida que passam e termina com as estatísticas; o speedup mostra quanto se poupou por transferir só as diferenças.

Compressão, números legíveis e progresso

  • -z — comprime os dados em trânsito. Vale a pena com texto em ligações lentas; numa rede local rápida, ou com vídeo e imagens já comprimidos, só gasta CPU.
  • -h — números legíveis: 4.01M em vez de 4,009,798.
  • --progress — bytes, percentagem, velocidade e tempo de cada ficheiro. Escreve-se muitas vezes -P, que lhe junta o --partial.
$ rsync -avh projeto/ backup/
...
total size is 373.47M  speedup is 93.14

Ensaio a seco e itemize

Se só decorar uma opção, que seja esta: o -n (--dry-run) mostra exatamente o que seria copiado e apagado, mas não toca em nada, e a última linha termina em (DRY RUN). Corra primeiro com -avn, confirme a lista e só depois tire o n. Para mais detalhe, o -i (itemize) dá um código por ficheiro:

$ rsync -ain projeto/ backup/
>f+++++++++ build.tmp
.f...p..... deploy.sh
>f.st...... index.html
cd+++++++++ cache/
  • 1.º carácter, a ação: > recebido, < enviado para um servidor, c criado localmente, . só atributos, * mensagem (*deleting).
  • 2.º, o tipo: f ficheiro, d diretório, L ligação simbólica.
  • Os restantes, o que difere: c checksum, s tamanho, t data, p permissões, o dono, g grupo. Uma fila de + é um ficheiro novo.

Apagar com –delete

Por omissão, o rsync só acrescenta e atualiza: o que se apaga na origem fica no destino, que acumula lixo. O --delete torna o destino um espelho exato da origem — e é a opção mais perigosa do rsync: com uma barra a mais ou uma origem vazia (um disco de rede que não montou, por exemplo), limpa um destino inteiro. Três precauções:

  • Testar sempre primeiro com -n e ler cada linha deleting.
  • --max-delete=N — ao atingir N apagamentos, o rsync deixa de apagar, avisa e sai com o código 25. Não desfaz os primeiros N, mas trava o desastre e faz falhar o script que o chamou.
  • --delete-after — adia os apagamentos para o fim, para que um erro a meio não deixe o destino num estado inconsistente.
rsync -avn --delete projeto/ backup/
rsync -av --delete --delete-after --max-delete=50 projeto/ backup/

Filtros: –exclude e –include

O --exclude ignora o que corresponde a um padrão e pode repetir-se; um padrão terminado em / só se aplica a diretórios. O --include abre exceções, e a combinação clássica é incluir primeiro o que interessa e excluir tudo o resto com *:

rsync -av --exclude='*.tmp' --exclude='cache/' projeto/ backup/
rsync -av --include='*.pdf' --exclude='*' projeto/ pdfs/

A ordem importa: a primeira regra que coincide vence. Com --exclude='*' --include='*.pdf' não passa nada, porque o * apanha tudo primeiro. Para descer a subdiretórios, acrescente --include='*/' antes do * (e -m para não criar pastas vazias). O que está excluído fica também protegido do --delete.

  • --exclude-from=FICHEIRO — lê os padrões de um ficheiro, um por linha (# marca comentários): mais limpo do que dezenas de --exclude e reutilizável.
  • --filter (-f) — a forma geral das regras: - padrão exclui, + padrão inclui, P padrão protege do --delete.

Transporte, retomar e verificar

Com destino remoto, o rsync usa SSH por omissão; o -e personaliza o transporte (porta, chave, opções):

rsync -avz -e "ssh -p 2222 -i ~/.ssh/bkp_ed25519" projeto/ aluno@198.51.100.20:/srv/bkp/
  • --partial — se a transferência cair, guarda o que já chegou e a execução seguinte retoma em vez de recomeçar. Com o -P (partial + progresso), é quase obrigatório em ficheiros grandes.
  • -c (checksum) — o quick check engana-se se as datas forem manipuladas ou se um ficheiro se corromper sem mudar de tamanho. Com -c, o rsync compara um checksum de cada ficheiro dos dois lados: mais lento, mas infalível. Ideal para verificar um backup.
$ rsync -anic projeto/ backup/
>fc........ manual.pdf

Backups incrementais com –link-dest

A joia do rsync para backups é o --link-dest: aponta para a cópia anterior e, para os ficheiros que não mudaram, cria ligações físicas em vez de os copiar de novo. Cada pasta diária parece completa, mas os ficheiros inalterados partilham o mesmo espaço em disco. Um caminho relativo conta a partir do destino.

$ rsync -a --link-dest=../2026-10-23 projeto/ snap/2026-10-24/
$ du -sh snap/*
353M    snap/2026-10-23
3.9M    snap/2026-10-24
  • --backup com --backup-dir=PASTA — guarda as versões antigas do que é substituído ou apagado numa pasta à parte (sem --backup-dir, ficam ao lado, com o sufixo ~).
  • -u (update) — salta os ficheiros mais recentes no destino, para não pisar alterações feitas do outro lado.
rsync -av --delete --backup --backup-dir=../versoes/2026-10-24 projeto/ backup/

rsync em cibersegurança

Um espelho não é um backup. Se um ransomware cifrar a origem, os ficheiros cifrados são, para o rsync, «alterados», e a sincronização seguinte substitui as cópias boas pelas cifradas; com --delete, também os apagamentos se propagam. Um backup resistente guarda versões — instantâneos diários com --link-dest ou pastas datadas com --backup-dir, mantidos durante semanas — e, idealmente, uma cópia fora de linha.

Destino só acessível por uma chave SSH restrita. Se a produção tem uma chave com acesso total ao servidor de backups, quem a comprometer apaga também os backups. Use uma chave dedicada, limitada no authorized_keys pelo script rrsync, distribuído com o rsync, que a confina a uma pasta e pode impedir a escrita ou os apagamentos. Melhor ainda é o modelo «pull»: o servidor de backups puxa os dados com uma chave só de leitura e a produção não tem credenciais para lá chegar.

# ~/.ssh/authorized_keys em srv-web01: esta chave só pode ler /srv/www
command="rrsync -ro /srv/www",restrict ssh-ed25519 <chave-pública> aluno@hjfr

Verificar antes de confiar. Ensaie com -n sempre que mudar um comando com --delete, use --max-delete nos scripts e trate o código 25 como alerta: um ensaio que de repente lista centenas de ficheiros alterados é, em si, sinal de que algo está a cifrar ou a apagar dados. Verifique os backups com rsync -anic, que apanha corrupção silenciosa, e teste os restauros para uma pasta nova.

Experimente no simulador interativo

O simulador recria um laboratório: a pasta projeto/ e, em backup/, a cópia de ontem — com ficheiros alterados, novos, um que já não existe na origem e um PDF corrompido que o quick check não deteta. À esquerda, origem e destino lado a lado, com um símbolo para o que cada comando fez a cada ficheiro; à direita, o terminal. Demonstrar tudo segue os capítulos do vídeo; Anterior e Seguinte navegam; Repor estado volta ao início.

Erros comuns e boas práticas

  • Errar a barra final: projeto e projeto/ não são o mesmo. Confirme no ensaio onde vão parar os ficheiros.
  • Usar --delete sem ensaio: primeiro -n; em scripts, --max-delete e verificação do código de saída.
  • Confundir espelho com backup: um espelho replica apagamentos e ficheiros cifrados. Guarde versões.
  • Usar só -r: sem o -a, perdem-se datas e permissões e cada execução copia tudo outra vez.
  • Ignorar a ordem dos filtros: os --include vêm antes do --exclude='*'.
  • Esquecer o que o -a não inclui: ACL, atributos estendidos e ligações físicas exigem -A, -X e -H.

Conclusão

O rsync resume-se a poucas ideias: a barra final decide onde os ficheiros vão parar, o -a garante cópias fiéis, o -n mostra o que vai acontecer antes de acontecer, e o --delete, os filtros, o SSH e o --link-dest fazem dele um motor de backups. A regra que fica: ensaiar sempre, guardar versões e proteger o destino. Para o transporte, veja o nosso artigo sobre o ssh e o scp; para juntar e comprimir uma cópia num só ficheiro, o guia do tar e do gzip.

Workshop — Linha de Comandos Linux

Quer passar da leitura à prática, com exercícios reais e acompanhamento? No workshop Linha de Comandos Linux da HJFR trabalha estes e outros comandos da série — da administração do dia a dia à resposta a incidentes.

Este artigo faz parte da série «Comandos Linux, um a um» do blog HJFR — fique atento aos próximos comandos.