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

1. O Que Você Vai Aprender


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

BASH
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

BASH
# 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

TEXT
# 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

BASH
# 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:

(5) ▶ Exemplo: Arquivar e Extrair com tar

TEXT
# 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

BASH
# 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

TEXT
# 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

BASH
# 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:

TEXT
sending 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

BASH
#!/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

BASH
#!/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 -czf equivale a arquivar com tar → compactar com gzip. Extensões do arquivo: .tar.gz ou .tgz.

P: O que significam -c, -z, -f no tar -czf? R: -c (create) cria o arquivo, -z (gzip) compacta com gzip, -f (file) indica o nome do arquivo. A forma abreviada tar -czf pode ser escrita como tar -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-dest para criar snapshots via hard link: a primeira execução é completa; depois, cada dia usa --link-dest apontando para o snapshot do dia anterior, guardando só as alterações.


📖 Resumo


📝 Exercícios

  1. Básico (⭐): Compacte ~/projects ou um diretório de teste como backup.tar.gz, use -v para acompanhar o processo, e depois use tar -tf para ver a lista de arquivos dentro
  2. Intermediário (⭐⭐): Extraia em /tmp/test e verifique a integridade dos arquivos, depois crie um diretório de teste, compacte com zip (excluindo um subdiretório), e descompacte em outro lugar
  3. 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
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%