Linux: Compactação e Arquivamento
Backup de dados é o seguro-vida da operação. No Linux, tar + gzip é a solução de arquivamento mais universal, e o rsync é a ferramenta de sincronização incremental mais poderosa.
📋 Pré-requisitos: Você já deve conhecer
- Aula 18: Gerenciamento de Pacotes
1. O Que Você Vai Aprender
- tar: criar e extrair arquivos
- gzip vs bzip2 vs xz — comparar algoritmos de compressão
- zip: compactação multiplataforma
- rsync: sincronização incremental
- Estratégias de backup automatizado
2. A História do "Esqueci o Parâmetro Exclude"
(1) O Problema: Empacotou o Que Não Devia
Xiaoming precisava enviar a pasta do projeto para um colega — o time combinou de não transferir node_modules nem .git porque são grandes demais e desnecessários.
(2) Um Comando Para um Arquivo Perfeito
tar -czf projeto.tar.gz \
--exclude=node_modules \
--exclude=.git \
--exclude=__pycache__ \
projeto/
(3) O Benefício: Pacote Limpinho
O arquivo compactado do Xiaoming foi de 500MB (com node_modules) para 2MB. O colega conseguiu usar logo depois de extrair.
3. Pontos-Chave
(1) tar — Ferramenta de Arquivamento
# Criar arquivo tar
tar -cf arquivo.tar arquivo1 arquivo2 dir/ # Apenas arquiva
tar -czf arquivo.tar.gz dir/ # Arquiva + compacta com gzip
> 💡 Dica: Mnemônico das opções `tar -czf` — `c` (create, criar), `z` (gzip, compactar com gzip), `f` (file, indicar o nome do arquivo). Esta é a combinação mais comum; o `.tar.gz` resultante é o formato padrão de distribuição no mundo Linux. Para extrair, basta trocar o `c` por `x` (extract): `tar -xzf`.
tar -cjf arquivo.tar.bz2 dir/ # Arquiva + compacta com bzip2
tar -cJf arquivo.tar.xz dir/ # Arquiva + compacta com xz
# Extrair
tar -xf arquivo.tar # Extrai (detecta o formato automaticamente)
tar -xzf arquivo.tar.gz # Extrai .tar.gz
tar -xf arquivo.tar -C /destino/ # Extrai para um diretório específico
# Listar conteúdo
tar -tf arquivo.tar.gz # Pré-visualiza a lista de arquivos dentro do arquivo
> ⚠️ Atenção: Antes de extrair um arquivo tar, use `tar -tf` para pré-visualizar a lista de arquivos — confirme que não há "bombas" (por exemplo, arquivos que explodem em uma quantidade absurda de arquivos pequenos, ou caminhos começando com `/`, indicando caminhos absolutos), para evitar sobrescrever arquivos do sistema ou lotar o disco.
# Excluir
tar -czf backup.tar.gz --exclude="*.log" --exclude=node_modules dir/
| Opção do tar | Significado |
|---|---|
-c |
Criar arquivo |
-x |
Extrair |
-t |
Listar conteúdo |
-f |
Indicar o nome do arquivo |
-z |
Filtrar por gzip |
-j |
Filtrar por bzip2 |
-J |
Filtrar por xz |
-v |
Mostrar arquivos processados |
-C |
Extrair no diretório indicado |
--exclude |
Exclui arquivos que casam com o padrão |
(2) Comparação de Algoritmos de Compressão
| Algoritmo | Extensão | Opção | Taxa de Compressão | Velocidade | Caso de Uso |
|---|---|---|---|---|---|
| gzip | .gz |
-z |
Média | Rápido | Backup diário e distribuição |
| bzip2 | .bz2 |
-j |
Alta | Lento | Quando precisa de compactação maior |
| xz | .xz |
-J |
Altíssima | Muito lento | Arquivamento de longo prazo, tamanho mínimo |
(3) zip/unzip — Compactação Multiplataforma
# Compactar
zip -r projeto.zip projeto/ # Compacta diretório recursivamente
zip -r projeto.zip projeto/ -x "*.git*" # Exclui .git
zip -r projeto.zip projeto/ -P senha # Criptografa
# Extrair
unzip projeto.zip # Extrai no diretório atual
unzip projeto.zip -d /destino/ # Extrai no diretório indicado
unzip -l projeto.zip # Vê o conteúdo sem extrair
# Vantagem do zip: suportado nativamente em todos os sistemas operacionais
(4) rsync — Sincronização Incremental
# Uso básico
rsync -av origem/ destino/ # Sincronização local (recursivo + preserva atributos)
rsync -av --delete origem/ destino/ # Sincroniza e apaga no destino o que não está na origem
> ℹ️ Nota: `rsync --delete` faz o destino ficar idêntico à origem — arquivos no destino que não existem na origem serão apagados. Se você errar (por exemplo, caminho de origem errado), pode acabar apagando muitos dados do destino. Sempre rode com `--dry-run` antes para pré-visualizar a operação.
rsync -avz origem/ usuario@host:/destino/ # Sincronização remota (com compactação)
rsync -avz -e "ssh -p 2222" origem/ host:/destino/ # Indica a porta SSH
# Excluir
rsync -av --exclude="node_modules" --exclude=".git" origem/ destino/
# Backup incremental (com hard links)
rsync -av --link-dest=../backup-ontem/ origem/ backup-hoje/
Vantagens do rsync:
- Transferência incremental (envia só o que mudou)
- Suporta transferência compactada (
-z) - Retoma transferências interrompidas
- Transferência segura via SSH
(5) ▶ Exemplo: Arquivar e Extrair com tar
# Compacta o diretório projects dentro de home
tar -czf projects-backup.tar.gz ~/projects/
# Vê o conteúdo do arquivo
tar -tf projects-backup.tar.gz | head -10
# Extrai em /tmp
tar -xzf projects-backup.tar.gz -C /tmp/
# Com saída detalhada
tar -czvf meu-backup.tar.gz --exclude="*.log" /var/log/
(6) ▶ Exemplo: Comparação de Algoritmos de Compressão
# Prepara dados de teste
mkdir -p /tmp/compress-test
cp -r /usr/share/doc/* /tmp/compress-test/ 2>/dev/null
# gzip
time tar -czf test.tar.gz -C /tmp compress-test
ls -lh test.tar.gz
# bzip2
time tar -cjf test.tar.bz2 -C /tmp compress-test
ls -lh test.tar.bz2
# xz
time tar -cJf test.tar.xz -C /tmp compress-test
ls -lh test.tar.xz
# Resultado da comparação
# Em geral: test.tar.gz é o maior mas o mais rápido, test.tar.xz é o menor mas o mais lento
Saída:
TEXT-rw-r--r-- 1 alice alice 1.2M test.tar.gz real 0m0.234s user 0m0.198s sys 0m0.036s -rw-r--r-- 1 alice alice 856K test.tar.bz2 real 0m1.456s user 0m1.389s sys 0m0.067s -rw-r--r-- 1 alice alice 612K test.tar.xz real 0m5.123s user 0m4.987s sys 0m0.136s
(7) ▶ Exemplo: zip Para Distribuição Multiplataforma
# Arquiva o projeto (excluindo diretórios desnecessários)
cd ~/projects
zip -r myapp.zip myapp/ -x "myapp/node_modules/*" "myapp/.git/*" "myapp/__pycache__/*"
# Vê o conteúdo
unzip -l myapp.zip | head -20
# Criptografa o arquivo
zip -r -e segredo.zip confidencial/ # Vai pedir uma senha
(8) ▶ Exemplo: Backup com rsync
# Backup local
rsync -av --delete ~/projects/ /backup/projects/
# Backup remoto em um servidor
rsync -avz -e "ssh -i ~/.ssh/minhachave" \
--exclude="node_modules" \
--progress \
~/projects/ usuario@servidor-backup:/backups/
# Backup incremental (usando hard links)
# Dia 1
rsync -av /data/ /backup/2026-07-07/
# Dia 2 (guarda só as alterações)
rsync -av --link-dest=/backup/2026-07-07/ /data/ /backup/2026-07-08/
Saída:
TEXTsending incremental file list sent 1,234 bytes received 512 bytes 2,492.00 bytes/sec total size is 5.6M speedup is 3,210.45 sending incremental file list app.js config.yaml sent 4,567 bytes received 128 bytes 9,390.00 bytes/sec total size is 5.6M speedup is 1,197.23
(9) ▶ Exemplo: Script de Backup Automatizado
#!/bin/bash
# auto-backup.sh - Backup automatizado de diretórios críticos
BACKUP_ROOT="/backup"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
# Diretórios a fazer backup
declare -A DIRS
DIRS["projects"]="$HOME/projects"
DIRS["configs"]="/etc"
DIRS["notes"]="$HOME/notes"
echo "=== Starting backup: $DATE ==="
# Cria o diretório de backup
mkdir -p "$BACKUP_ROOT/$DATE"
for name in "${!DIRS[@]}"; do
src="${DIRS[$name]}"
dest="$BACKUP_ROOT/$DATE/$name.tar.gz"
if [ -d "$src" ]; then
echo "Backing up $src → $dest"
tar -czf "$dest" \
--exclude="node_modules" \
--exclude=".git" \
--exclude="*.log" \
"$src" 2>/dev/null
echo " ✅ $(du -h "$dest" | cut -f1)"
else
echo " ⚠️ Directory does not exist: $src"
fi
done
# Apaga backups expirados
echo ""
echo "Cleaning backups older than $RETENTION_DAYS days..."
find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
echo "=== Backup complete ==="
Saída:
TEXT=== Starting backup: 20260707 === Backing up /home/alice/projects → /backup/20260707/projects.tar.gz ✅ 12M Backing up /etc → /backup/20260707/configs.tar.gz ✅ 4.5M Backing up /home/alice/notes → /backup/20260707/notes.tar.gz ✅ 256K Cleaning backups older than 30 days... === Backup complete ===
(10) ▶ Exemplo Abrangente: Solução Completa de Backup com rsync
#!/bin/bash
# rsync-backup.sh - Backup incremental usando rsync
SOURCE="$HOME/projects/webapp"
DEST_USER="backup"
DEST_HOST="backup.example.com"
DEST_PATH="/backups/webapp"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOGFILE="/var/log/backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE"
}
log "Starting backup of $SOURCE..."
# Executa o backup incremental remoto com rsync
rsync -avz \
--delete \
--partial \
--progress \
--exclude="node_modules" \
--exclude=".git" \
--exclude=".env" \
--exclude="tmp/" \
-e "ssh -i ~/.ssh/backup_key -p 22" \
"$SOURCE/" \
"${DEST_USER}@${DEST_HOST}:${DEST_PATH}/current/" >> "$LOGFILE" 2>&1
if [ $? -eq 0 ]; then
log "✅ Backup succeeded"
# Cria um snapshot com timestamp
ssh -i ~/.ssh/backup_key "${DEST_USER}@${DEST_HOST}" \
"cp -al ${DEST_PATH}/current ${DEST_PATH}/${TIMESTAMP}"
log "✅ Snapshot created: $TIMESTAMP"
else
log "❌ Backup failed (exit code: $?)"
exit 1
fi
❓ Perguntas Frequentes
P: Qual a relação entre tar e gzip? R: O tar só faz o arquivamento (juntar vários arquivos em um), não compacta. O gzip é quem compacta. A combinação
tar -czfequivale a arquivar com tar → compactar com gzip. Extensões do arquivo:.tar.gzou.tgz.
P: O que significam
-c,-z,-fnotar -czf? R:-c(create) cria o arquivo,-z(gzip) compacta com gzip,-f(file) indica o nome do arquivo. A forma abreviadatar -czfpode ser escrita comotar -c -z -f.
P: Para uso multiplataforma, zip ou tar.gz? R: O zip tem compatibilidade melhor — Windows/macOS/Linux suportam nativamente. O tar.gz é o padrão do mundo Linux/Unix; no Windows é preciso instalar ferramentas de terceiros como o 7-Zip.
P: Por que o rsync é mais rápido que o scp? R: O rsync usa um algoritmo de transferência incremental — ele envia só as partes dos arquivos que mudaram. O scp sempre copia o arquivo inteiro. Para transferências repetidas dos mesmos arquivos com pequenas mudanças, o rsync é muito mais rápido.
P: Como fazer backup incremental em vez de backup completo? R: O rsync por padrão só transfere incrementos (as partes que mudaram). Combinado com
--link-destpara criar snapshots via hard link: a primeira execução é completa; depois, cada dia usa--link-destapontando para o snapshot do dia anterior, guardando só as alterações.
📖 Resumo
tar -czfarquiva e compacta,tar -xfextrai,tar -tfvê o conteúdo--excludeexclui arquivos desnecessários- gzip é o mais rápido, xz tem a melhor taxa de compactação, zip é o mais multiplataforma
rsync -avzsincronização incremental,--deleteremove arquivos extras no destino--link-destcria snapshots incrementais via hard link
📝 Exercícios
- Básico (⭐): Compacte
~/projectsou um diretório de teste comobackup.tar.gz, use-vpara acompanhar o processo, e depois usetar -tfpara ver a lista de arquivos dentro - Intermediário (⭐⭐): Extraia em
/tmp/teste verifique a integridade dos arquivos, depois crie um diretório de teste, compacte com zip (excluindo um subdiretório), e descompacte em outro lugar - Avançado (⭐⭐⭐): Use o rsync para sincronizar um diretório local em
/tmp/backup/, verifique a transferência incremental (modifique um arquivo e sincronize de novo, observando que só a alteração foi enviada), depois escreva um script de backup com suporte tanto a backup completo com tar.gz quanto a backup incremental com rsync