rsync: exemplos de sincronização de arquivos e backups no Linux
O rsync copia e sincroniza arquivos localmente e via SSH, transferindo apenas o que mudou. O comando básico é rsync -avz origem/ usuario@host:/caminho/: -a preserva permissões e datas, -v mostra os arquivos e -z comprime os dados; --delete torna o destino uma cópia exata da origem, e -n permite testar antes sem alterar nada.
O rsync é a ferramenta padrão do Linux para copiar e sincronizar arquivos: localmente, entre discos e entre servidores via SSH. Sua principal diferença em relação ao cp e ao scp é que ele transfere apenas o que mudou, então sincronizar de novo um diretório grande leva poucos segundos. Abaixo estão exemplos de rsync para tarefas típicas: enviar um projeto para o servidor, manter um espelho de diretório, usar exclusões, fazer backups com snapshots e agendar a execução.
Sintaxe e as opções mais úteis
A forma geral do comando é:
rsync [opções] ORIGEM... DESTINO
Origem e destino podem ser caminhos locais ou remotos no formato usuario@host:/caminho. Um dos lados sempre precisa ser local: o rsync não copia diretamente entre duas máquinas remotas.
| Opção | O que faz |
|---|---|
-a | modo arquivo: recursivo, preservando permissões, dono, grupo, data de modificação e links simbólicos (equivale a -rlptgoD) |
-v | mostrar a lista de arquivos transferidos |
-z | comprimir os dados durante a transferência pela rede |
-h | tamanhos em formato legível (K, M, G) |
-P | o mesmo que --partial --progress: mostra o progresso e retoma arquivos interrompidos |
-n, --dry-run | simulação: mostra o que seria feito sem alterar nada |
--delete | apagar no destino os arquivos que não existem na origem |
--exclude | não copiar arquivos que correspondem ao padrão |
-e | definir o shell remoto, por exemplo -e "ssh -p 2222" |
-H, -A, -X | preservar hard links, ACLs e atributos estendidos (não incluídos no -a) |
Na prática, em nove de cada dez casos basta rsync -avh para cópias locais e rsync -avzh para cópias pela rede.
Barra no final do caminho: a armadilha principal
O erro mais comum de quem está começando está na barra no final da origem. Ela define se é copiado o próprio diretório ou apenas o seu conteúdo.
# Copiar o DIRETÓRIO project para dentro de /backup → resulta em /backup/project/...
rsync -av project /backup/
# Copiar o CONTEÚDO de project para /backup → os arquivos ficam diretamente em /backup/
rsync -av project/ /backup/
Para lembrar: a barra no final da origem significa "o conteúdo deste diretório". No destino, a barra não faz diferença. Se tiver dúvida, adicione -n e veja quais caminhos o rsync pretende criar.
Cópia local
Copiar um diretório para um pen drive, com barra de progresso:
rsync -avhP ~/fotos/ /mnt/usb/fotos/
Executar o mesmo comando de novo não copia tudo outra vez: o rsync compara o tamanho e a data de modificação dos arquivos e transfere apenas os novos e os alterados. A saída no final mostra quantos dados realmente foram enviados:
sending incremental file list
2026/10/IMG_2041.jpg
4.12M 100% 38.40MB/s 0:00:00 (xfr#1, to-chk=0/1534)
sent 4.13M bytes received 9.25K bytes 2.76M bytes/sec
total size is 6.82G speedup is 1,648.21
O valor de speedup mostra quantas vezes menos dados foram transferidos em comparação com uma cópia completa.
rsync via SSH: enviar para o servidor e trazer de volta
Para caminhos remotos, o rsync usa SSH por padrão, então não há nada a configurar à parte: basta que o login comum por ssh funcione. É mais prático com chaves, porque a senha não é pedida e o comando pode ser colocado no cron.
# Enviar o site para o servidor
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/
# Baixar os logs do servidor para a sua máquina
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/
# SSH em porta não padrão e com uma chave específica
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/
O rsync precisa estar instalado nas duas máquinas, porque no lado remoto ele é executado via SSH. Se não estiver lá, aparece rsync: command not found: instale o pacote (sudo apt install rsync ou sudo dnf install rsync).
Se o host estiver definido em ~/.ssh/config com um apelido, o rsync o entende: rsync -avz ./site/ prod:/var/www/site/.
Quando é preciso root no servidor
Se os arquivos no destino pertencem ao root, mas você entra como usuário comum, é possível executar o rsync remoto com sudo:
rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/
Para isso, o sudo do servidor precisa executar o rsync sem pedir senha (regra no sudoers). Caso contrário, o comando fica parado esperando uma senha.
Espelho de diretório: --delete
Por padrão, o rsync só adiciona e atualiza arquivos, mas não apaga nada. Para que o destino seja uma cópia exata da origem, é preciso usar --delete:
rsync -avh --delete ~/projetos/ /mnt/backup/projetos/
Essa é uma opção poderosa e perigosa. Um erro no caminho (por exemplo, uma origem vazia ou uma barra esquecida) pode apagar dados no destino. Por isso a regra é uma só: qualquer comando com --delete deve ser executado primeiro com -n.
$ rsync -avhn --delete ~/projetos/ /mnt/backup/projetos/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py
sent 1.20K bytes received 64 bytes 2.53K bytes/sec
total size is 18.4M speedup is 14,554.39 (DRY RUN)
As linhas deleting mostram o que será apagado. Depois de confirmar que está tudo certo, execute sem o -n.
Algumas variações úteis: --delete-after apaga os arquivos depois da transferência (o destino fica completo por mais tempo), e --backup --backup-dir=/mnt/backup/apagados-$(date +%F) não apaga, mas move os arquivos removidos ou substituídos para um diretório separado.
Exclusões: --exclude e --include
Excluir arquivos temporários, dependências e segredos é prática comum em deploys e backups.
# Vários padrões
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/
# Padrões lidos de um arquivo
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/
O arquivo .rsyncignore é uma lista simples de padrões, um por linha:
.git/
node_modules/
*.log
.env
tmp/
Como os padrões funcionam:
- Um padrão sem barra no início (
*.log) vale em qualquer profundidade. - Um padrão com barra no início (
/tmp/) fica preso à raiz da transferência — exclui apenas otmpdo nível superior. - Barra no final (
cache/) significa "somente diretórios". - As regras são verificadas em ordem, e vale a primeira que corresponder.
Dessa última regra vem um truque para "copiar somente o necessário": primeiro liberar, depois proibir o resto.
# Copiar somente os arquivos .conf, mantendo a estrutura de diretórios
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/
Aqui, --include='*/' é necessário para que o rsync entre em todos os subdiretórios. Acrescente --prune-empty-dirs (-m) para não criar pastas vazias.
Backups com rsync
Cópia diária simples
Um backup mínimo do diretório pessoal para um segundo disco:
rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/
A desvantagem dessa abordagem é que só existe uma versão guardada. Se um arquivo for estragado e o backup for sincronizado logo em seguida, a versão antiga se perde.
Snapshots incrementais com --link-dest
A opção --link-dest resolve esse problema quase sem custo de espaço. Arquivos que não mudaram não são copiados de novo: são criados como hard links para os arquivos do snapshot anterior. Cada snapshot parece uma cópia completa, mas ocupa espaço apenas com as mudanças.
#!/bin/bash
set -euo pipefail
SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"
mkdir -p "$DEST"
rsync -aH --delete \
--exclude='.cache/' \
--link-dest="$DEST/latest" \
"$SRC" "$DEST/$TODAY"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
Na primeira execução, o diretório latest ainda não existe: o rsync mostra um aviso e faz uma cópia completa, o que é normal. Snapshots antigos são removidos com o rm -rf comum: arquivos que outros snapshots também usam não desaparecem.
Para apagar snapshots com mais de 30 dias:
find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +
Backup de um servidor em outra máquina
Vale a pena organizar a direção "do servidor de backup para a máquina de trabalho": o servidor de backup puxa os dados, e o servidor de produção não tem acesso às cópias. Se ele for invadido, os backups continuam intactos.
rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
backup@web01:/var/www/ /srv/backups/web01/www/
Atenção: bancos de dados não devem ser copiados dessa forma, porque os arquivos de um SGBD em funcionamento ficam inconsistentes durante a cópia. Faça antes um dump (mysqldump, pg_dump) e deixe o rsync transferir o arquivo de dump pronto.
Execução agendada pelo cron
O script de backup é colocado no cron com o comando crontab -e:
# Todo dia às 03:15, com a saída gravada no log
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
O que conferir para que o backup executado pelo cron funcione de fato:
- O script usa caminhos absolutos, porque o cron tem um
PATHmínimo e um diretório atual diferente. - A chave SSH não tem senha e o host já está em
known_hosts— senão o rsync trava na pergunta sobre a autenticidade da chave. - O script verifica o código de retorno: o rsync retorna 0 em caso de sucesso, 23 se parte dos arquivos não foi transferida e 24 se arquivos sumiram durante a cópia.
- Para impedir que duas cópias rodem ao mesmo tempo, use
flock:flock -n /tmp/backup.lock /usr/local/bin/backup.sh.
Em vez do cron, pode-se usar um timer do systemd: ele grava a saída no journal, e os resultados são consultados facilmente com journalctl.
Opções úteis para transferências grandes
| Tarefa | Opção |
|---|---|
| Limitar a velocidade para não saturar o canal | --bwlimit=5M |
| Retomar um arquivo grande após uma queda | -P (ou --partial) |
| Progresso geral em vez da lista de arquivos | --info=progress2 |
| Comparar pelo conteúdo, e não pela data | -c (--checksum), mais lento |
| Não alterar arquivos que são mais novos no destino | -u (--update) |
| Não sobrescrever arquivos existentes | --ignore-existing |
| Apagar os arquivos de origem após a transferência (mover) | --remove-source-files |
| Estatísticas detalhadas no final | --stats |
Erros comuns e como corrigi-los
Permission deniedao gravar — o usuário não tem permissão no diretório de destino. Verifique o dono do diretório ou use--rsync-path="sudo rsync".- Os arquivos são copiados de novo a cada vez — a data de modificação não é preservada. Confirme que há
-aou-t; em FAT/exFAT acrescente--modify-window=2, porque esses sistemas guardam a hora com precisão de dois segundos. - Erros de
chownouchgrpao copiar para pen drive ou pasta de rede — o sistema de arquivos não suporta donos. Troque-apor-rlt. - Aparece um nível extra
/backup/project/project— a barra no final da origem foi esquecida ou colocada no lugar errado. connection unexpectedly closed— problema no SSH ou rsync não instalado no lado remoto. Teste o login comum comsshe confirme que orsyncexiste no servidor.
Conclusão
No dia a dia, basta memorizar alguns comandos: rsync -avz origem/ host:/destino/ para copiar via SSH, --delete junto com o teste -n para espelhos, --exclude para deixar de fora o que não interessa, e --link-dest para backups com snapshots. Preste atenção à barra no final da origem, e o rsync será a forma mais confiável de transferir arquivos entre máquinas. Sincronização e backup são praticados no curso de Linux.
Perguntas frequentes
Qual a vantagem do rsync sobre o scp?
O scp copia os arquivos inteiros a cada vez, enquanto o rsync transfere apenas as mudanças e ainda consegue retomar transferências, apagar o que sobrou no destino e excluir arquivos por padrão. Para copiar um único arquivo a diferença é pequena, mas para sincronizações regulares o rsync é bem mais rápido.
Dá para usar o rsync no Windows?
Sim, pelo WSL, onde o rsync se instala como em qualquer Linux, ou pelo Cygwin. Sincronizar arquivos de um computador Windows com um servidor Linux é mais simples a partir do WSL.
O rsync criptografa os dados transferidos?
O próprio rsync não criptografa, mas, quando a cópia é feita via SSH, todo o tráfego passa pela conexão SSH criptografada. Sem criptografia ficam apenas os casos em que se usa um daemon rsync pelo endereço do tipo rsync://.
Como verificar se a cópia é idêntica ao original?
Execute rsync -avnc origem/ destino/ — com a opção -c os arquivos são comparados por checksum, e o -n não altera nada. Se a lista de arquivos sair vazia, as cópias são idênticas.
O que acontece se eu interromper o rsync no meio da transferência?
Os arquivos já transferidos permanecem, e o arquivo que estava sendo copiado é apagado por padrão. Ao repetir o mesmo comando, a transferência continua de onde parou, e com a opção -P a parte já copiada do arquivo interrompido também é mantida.
Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.
Ir para o curso