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 (
-1a-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-readpara continuar extraindo mesmo com erros:
tar -xzf backup_parcial.tar.gz --ignore-failed-read
- bzip2: Utilize
bzip2recoverpara 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.