Gerador de rsync
Monte um comando rsync com flags comuns: archive, verbose, compressão, dry-run, exclusões, delete e SSH remoto.
rsync em profundidade: o algoritmo, as flags e as armadilhas
rsync (abreviação de "remote sync") foi escrito em 1996 por Andrew Tridgell — o mesmo hacker australiano que criou o Samba e cujo trabalho de engenharia reversa do BitKeeper acabou levando ao nascimento do Git. O que diferencia o rsync do scp, do ftp ou de um simples cp -r é o seu algoritmo de delta com rolling checksum: o destinatário divide a sua cópia atual de cada arquivo em blocos de tamanho fixo, calcula um checksum fraco (rolling) e um hash forte (MD5/MD4) para cada bloco, e o remetente usa esses checksums para transmitir apenas os bytes que realmente mudaram. Numa imagem de máquina virtual de 10 GB em que você editou 200 KB, o rsync transfere cerca de 200 KB. O scp transfere 10 GB.
A invocação básica é rsync [opções] origem destino. Cada lado pode ser local, um caminho SSH remoto (user@host:/path) ou um módulo de daemon rsync (host::modulo/path). Este gerador emite o comando a partir das opções marcadas — as seções abaixo explicam o que cada flag faz, os idiomas mais úteis e as pegadinhas que já apagaram dados em produção.
As flags essenciais
-a(archive) — atalho para-rlptgoD: recursivo, copia symlinks como symlinks, preserva permissões, timestamps, grupo, dono, devices e arquivos especiais. É o que você quase sempre quer em um backup.-v/-vv/-vvv— níveis crescentes de verbosidade. Útil enquanto se monta o comando, ruidoso em cron.-z— comprime os dados em trânsito. Compensa em links lentos; é contraproducente numa LAN, em que o custo de CPU supera a banda economizada.-h— tamanhos legíveis (KB, MB, GB) na saída de progresso e no resumo.-P— equivalente a--partial --progress. Mantém arquivos parcialmente transferidos para retomada e imprime uma barra de progresso por arquivo.-n/--dry-run— faz o teatro sem gravar nada. Sempre rode um dry-run antes de usar--delete.--delete— remove no destino arquivos que não existem mais na origem. Faz do destino um espelho real — e apaga qualquer coisa que você esquecer de excluir.--exclude='padrão',--exclude-from=arquivo,--include='padrão'— regras de filtro. Os padrões seguem a sintaxe de glob do shell; as linhas de um exclude-from são lidas em ordem.-x/--one-file-system— não cruza pontos de montagem. Crucial em backups de/para não descer em/proc,/sysou NFS.--bwlimit=KBPS— limita a taxa de transferência. Use para deixar banda para o resto do time.--link-dest=DIR— cria hard links para arquivos inalterados de um snapshot anterior. Combinado com diretórios datados, dá um backup incremental estilo Time Machine por quase nenhum espaço extra.
A armadilha da barra final
Nenhum único caractere causou mais surpresas do que a barra / no fim do caminho de origem. Compare:
rsync -a src/ dst/ # copia o CONTEÚDO de src para dentro de dst
rsync -a src dst/ # cria dst/src/ e copia para dentro
Barra no fim da origem significa "o conteúdo de"; sem barra significa "este diretório como um nó". A barra no destino é inofensiva nos dois casos. Errar isso leva, com o tempo, a um dst/src/src/ aninhado ou, pior, a sobrescrever um diretório diferente.
Receitas que aparecem o tempo todo
# Espelhar um projeto num servidor, apagando o que foi removido
rsync -azP --delete --exclude='.DS_Store' --exclude='node_modules/' \
src/ user@server:/var/www/site/
# Snapshot estilo Time Machine usando hard links
rsync -a --link-dest=/backups/2026-05-26 /home/ /backups/2026-05-27/
# Retomar um download interrompido em conexão instável
rsync -azP --partial-dir=.rsync-partial user@host:big.iso .
# Throttle e execução silenciosa dentro do cron
rsync -a --bwlimit=2000 --delete src/ dst/ >> /var/log/sync.log 2>&1
rsync vs alternativas
- scp — criptografa e copia, mas sempre transfere o arquivo inteiro. Descontinuado a partir do OpenSSH 9; use
scp -Opara o protocolo legado ou troque porsftp/ rsync. - git — endereçado por conteúdo, mantém histórico; o rsync é file-level e sem histórico. Use git para código-fonte, rsync para binários, mídia e árvores de filesystem inteiras.
- zfs send / btrfs send — replicação em nível de bloco, snapshots atômicos entre máquinas com o mesmo filesystem. Mais rápido do que rsync, mas exige ZFS/btrfs nos dois lados.
- rclone — primo espiritual do rsync para object storage na nuvem (S3, GCS, B2, Dropbox, OneDrive). Mesmos idiomas de dry-run, delete e bwlimit.
- unison — sincronização bidirecional real, com detecção de conflito, onde o rsync é unidirecional.
Pegadinhas operacionais
--deleteé irreversível. Rode primeiro com-n --deletee leia a lista de arquivos antes de remover a flag de dry-run.- UID / GID divergentes. Quando origem e destino são máquinas diferentes,
-oe-gmapeiam por nome. Se os IDs de usuário não estiverem alinhados, o dono pode mudar no destino; force o mapeamento numérico com--numeric-ids. - Configuração de SSH. Para porta ou chave não padrão, use
-e 'ssh -p 2222 -i ~/.ssh/backup_key'ou defina o host em~/.ssh/confige deixe o rsync herdar. - Arquivos esparsos. Acrescente
-S/--sparseao copiar imagens de disco de VM para manter as regiões vazias vazias no destino. - Diretórios gigantes. O rsync monta a lista completa de arquivos em memória antes de transferir; para árvores com dezenas de milhões de arquivos use
--no-inc-recursiveou quebre o job em partes.
FAQ
O rsync sincroniza nas duas direções? Nativamente não — o rsync é unidirecional por invocação. Para sincronização bidirecional real, com resolução de conflito, use Unison ou rode dois comandos rsync complementares dentro de um wrapper que cuide dos deletes com atenção.
Dá para retomar uma transferência interrompida? Sim, com --partial (ou -P) o arquivo parcial é preservado e a próxima execução continua de onde parou, graças ao mesmo algoritmo de checksum.
Funciona no Windows? Sim — via Cygwin, MSYS2 ou WSL2. Alternativas nativas são o robocopy (já incluso) e o FreeFileSync. Em ambientes mistos POSIX/Windows, descarte -p e -o.
Como excluir uma pasta inteira mas manter um arquivo dentro? Use as regras de include/exclude na ordem certa: --include='dir/' --include='dir/keep.txt' --exclude='dir/*'. O rsync aplica a primeira regra que casa.
Por que o rsync está mais lento do que eu esperava? Causas comuns: -z numa LAN rápida, a fase de checksum em milhões de arquivos pequenos, --checksum forçando hash do arquivo inteiro ou cifra SSH ruim. Faça profile com --stats e teste -e 'ssh -c [email protected]', a cifra moderna mais barata.
Ferramentas Relacionadas
Gerador de find
Construa comandos find por nome, tipo, tamanho, idade e -exec/-delete. Útil para varreduras em scripts shell.
Gerador de comando tar
Monte comandos tar (criar, extrair, listar) com compressão (gz/bz2/xz/zst), preservar permissões e exclusões.
Gerador de Comando mysqldump
Monta um comando mysqldump com flags comuns: host, usuário, banco, opções (single-transaction, routines, triggers).