Compression: gzip, bzip2, xz e tar na prática

1. Introdução aos Algoritmos de Compressão no Bash

A compressão de arquivos é uma tarefa essencial no dia a dia de qualquer administrador de sistemas ou desenvolvedor que trabalha com Bash. Os algoritmos de compressão sem perda (lossless) garantem que os dados originais sejam recuperados exatamente como eram antes da compressão, sendo ideais para arquivos de texto, logs, bancos de dados e código-fonte.

No ecossistema Linux/Unix, três comandos se destacam: gzip, bzip2 e xz. Cada um oferece um equilíbrio diferente entre taxa de compressão e velocidade:

  • gzip: Mais rápido, compressão moderada (herança do LZ77)
  • bzip2: Velocidade mediana, melhor taxa que gzip (algoritmo Burrows-Wheeler)
  • xz: Mais lento, mas com a maior taxa de compressão (algoritmo LZMA)

Para verificar se estão disponíveis no sistema:

which gzip bzip2 xz
gzip --version | head -1
bzip2 --version 2>&1 | head -1
xz --version | head -1

Caso algum não esteja instalado, utilize o gerenciador de pacotes da sua distribuição (apt, yum, dnf, pacman).

2. Comandos Individuais de Compressão: gzip, bzip2, xz

Uso básico

Comprimir um arquivo com cada ferramenta:

gzip documento.txt          # gera documento.txt.gz
bzip2 dados.csv             # gera dados.csv.bz2
xz relatorio.log            # gera relatorio.log.xz

Para descomprimir:

gunzip documento.txt.gz
bunzip2 dados.csv.bz2
unxz relatorio.log.xz

Opções importantes

  • Nível de compressão (-1 a -9): Quanto maior o número, melhor a compressão, mas mais lento o processo.
  • -k (keep): Mantém o arquivo original após compressão.
  • -v (verbose): Exibe informações detalhadas do processo.
gzip -9 -k -v arquivo_importante.sql
bzip2 -9 -k relatorio_financeiro.csv
xz -9 -k backup_diario.log

Compressão em pipeline

Uma das grandes vantagens no Bash é combinar comandos via pipe:

cat dados_originais.txt | gzip > dados_comprimidos.gz
bzip2 < dados_originais.txt > dados_comprimidos.bz2
xz < entrada.log > saida.xz

3. O Comando tar: Empacotamento e Compressão Combinados

O tar (Tape ARchive) originalmente apenas empacotava arquivos, mas hoje integra nativamente os algoritmos de compressão.

Estrutura básica

  • -c: Cria um novo arquivo
  • -x: Extrai o conteúdo
  • -t: Lista o conteúdo sem extrair
  • -f: Especifica o nome do arquivo

Flags de compressão

  • -z: gzip
  • -j: bzip2
  • -J: xz

Exemplos práticos

Criando arquivos compactados:

tar -czf projeto.tar.gz /caminho/do/projeto/
tar -cjf backup_2024.tar.bz2 /dados/importantes/
tar -cJf sistema_completo.tar.xz /etc/ /var/log/

Extraindo arquivos:

tar -xzf projeto.tar.gz
tar -xjf backup_2024.tar.bz2
tar -xJf sistema_completo.tar.xz -C /destino/

Listando conteúdo sem extrair:

tar -tzf projeto.tar.gz | head -20
tar -tjf backup_2024.tar.bz2 | grep "*.conf"

4. Trabalhando com Arquivos Compactados em Scripts

Verificação de integridade

Sempre verifique a integridade antes de extrair arquivos críticos:

gzip -t dados.sql.gz && echo "Arquivo íntegro" || echo "Arquivo corrompido"
bzip2 -t backup.tar.bz2 && echo "OK" || echo "Falha na integridade"
xz -t sistema.tar.xz && echo "Integridade confirmada"

Extração seletiva

Extraia apenas arquivos específicos de um tarball:

tar -xzf arquivos.tar.gz --wildcards "*.txt"
tar -xjf dados.tar.bz2 "caminho/especifico/arquivo.conf"
tar -xJf pacote.tar.xz --to-stdout "README.md" > README_extraido.md

Uso de find + tar para compactação seletiva

Compacte apenas arquivos com extensão .log modificados nos últimos 7 dias:

find /var/log -name "*.log" -mtime -7 -print0 | tar -czf logs_recentes.tar.gz --null -T -

5. Comparação de Performance e Escolha do Algoritmo

Benchmark básico

Teste o desempenho com um arquivo grande:

# Crie um arquivo de teste
dd if=/dev/urandom of=teste_100mb.bin bs=1M count=100

# Compare os tempos
time gzip -9 teste_100mb.bin
time bzip2 -9 teste_100mb.bin
time xz -9 teste_100mb.bin

Quando usar cada algoritmo

Algoritmo Melhor para Velocidade Taxa de compressão
gzip Logs, backups rápidos, transferências web Alta Baixa
bzip2 Arquivos de texto grandes, código-fonte Média Média
xz Backups finais, arquivos de instalação, pacotes Baixa Alta

Monitoramento de recursos

Use top ou htop em outro terminal durante a compressão:

# Em um terminal
xz -9 arquivo_muito_grande.iso

# Em outro terminal
top -p $(pgrep xz)

6. Automação com Scripts: Backup e Rotação

Script de backup incremental com tar e xz

#!/bin/bash
BACKUP_DIR="/backups"
ORIGEM="/dados/criticos"
DATA=$(date +%Y%m%d)
ARQUIVO="$BACKUP_DIR/backup_$DATA.tar.xz"

tar -cJf "$ARQUIVO" "$ORIGEM" && echo "Backup concluído: $ARQUIVO"

Rotação de logs compactados com gzip

#!/bin/bash
LOG_DIR="/var/log/meuapp"
find "$LOG_DIR" -name "*.log" -mtime +7 -exec gzip -9 {} \;
find "$LOG_DIR" -name "*.log.gz" -mtime +30 -delete

Pipeline para backup de banco de dados

mysqldump -u root --all-databases | gzip > backup_mysql_$(date +%Y%m%d_%H%M%S).sql.gz

7. Boas Práticas e Resolução de Problemas Comuns

Arquivos corrompidos

  • tar: Use --ignore-failed-read para continuar extraindo mesmo com erros:
tar -xzf backup_parcial.tar.gz --ignore-failed-read
  • bzip2: Utilize bzip2recover para recuperar dados de blocos íntegros:
bzip2recover arquivo_corrompido.bz2

Monitoramento de progresso com pv

Para operações longas, use pv (pipe viewer):

tar -czf - /dados/grandes/ | pv -s $(du -sb /dados/grandes/ | awk '{print $1}') > backup_grande.tar.gz

Dicas de segurança

  • Nunca comprima arquivos já compactados: Isso pode aumentar o tamanho e desperdiçar recursos.
  • Verifique espaço em disco antes de operações grandes:
df -h /destino/
du -sh /origem/
  • Teste a extração após criar backups críticos:
tar -tzf backup_importante.tar.gz > /dev/null && echo "Backup válido"

Referências

  • GNU Gzip Manual — Documentação oficial completa do gzip, incluindo todas as opções e exemplos de uso.
  • Bzip2 Official Website — Página oficial do bzip2 com documentação, downloads e detalhes técnicos do algoritmo.
  • XZ Utils Documentation — Documentação oficial do xz, com exemplos avançados e explicações sobre o formato LZMA.
  • GNU Tar Manual — Manual completo do tar, cobrindo desde o básico até opções avançadas de compressão e automação.
  • Linux Compression Tools Comparison — Artigo técnico comparando desempenho e taxas de compressão entre gzip, bzip2 e xz com benchmarks reais.