Arquivamento e compressão no Linux: tar, gzip, bzip2 e zip na prática

Tem uma confusão conceitual que persegue quem está começando com Linux, e que vale desfazer logo no início deste artigo: arquivar e comprimir são duas coisas diferentes, mesmo que a gente use os dois termos meio misturados no dia a dia. Arquivar é juntar vários arquivos e diretórios em um único arquivo, preservando estrutura, permissões e metadados. Comprimir é reduzir o tamanho dos dados, usando algum algoritmo que elimina redundância. O .zip do Windows faz as duas coisas ao mesmo tempo, num pacote só — e é por isso que, para quem vem desse mundo, a separação entre tar (arquivar) e gzip/bzip2 (comprimir) do universo Linux parece estranha à primeira vista.

Esse tema, além de aparecer o tempo todo no dia a dia — fazer backup do diretório pessoal, empacotar um projeto para enviar a alguém, extrair um pacote baixado da internet —, é também um dos tópicos cobrados na certificação LPI Essentials, dentro da área de conhecimento sobre arquivos e compressão. Vamos entender a fundo.

tar: arquivar, não comprimir (por padrão)

O nome tar vem de tape archive — literalmente, arquivo de fita magnética, uma herança dos tempos de backup em fita. Na essência, tar pega um conjunto de arquivos e diretórios e os empacota num único arquivo, mantendo estrutura de diretórios, permissões, dono e timestamps.

Criando um arquivo tar

tar -cvf backup.tar Documentos/

Vale entender cada letra dessas flags, porque tar tem uma sintaxe peculiar (não exige - antes das opções, embora seja aceito, e a ordem das letras costuma seguir uma convenção):

  • -c (create) — cria um novo arquivo tar.
  • -v (verbose) — mostra cada arquivo conforme é processado.
  • -f (file) — especifica o nome do arquivo de destino. Essa opção precisa ser a última da sequência de letras, porque o argumento que vem logo depois dela (backup.tar) é interpretado como o nome do arquivo — colocar -f no meio da sequência de flags é um erro comum que faz tar tentar usar a letra seguinte como nome de arquivo.

Extraindo um arquivo tar

tar -xvf backup.tar

-x (extract) no lugar de -c. O restante da lógica é igual.

Listando o conteúdo sem extrair

Antes de extrair um .tar desconhecido — especialmente um baixado da internet —, é uma boa prática conferir o que ele contém, sem extrair nada ainda:

tar -tvf backup.tar

-t (list) mostra a lista de arquivos, com permissões, dono e tamanho — o mesmo formato de um ls -l — sem tocar em nenhum arquivo do disco.

Extraindo em um diretório específico

tar -xvf backup.tar -C /destino/

-C muda o diretório de trabalho antes de extrair, evitando espalhar os arquivos no diretório atual. É praticamente obrigatório usar essa flag ao extrair pacotes baixados, para não bagunçar o diretório onde você está.

Combinando tar com compressão: -z e -j

Sozinho, tar só empacota — o arquivo resultante não é menor que a soma dos arquivos originais (pode até ser marginalmente maior, por causa dos metadados). É aí que entra a combinação com um algoritmo de compressão, e é exatamente por isso que você vê extensões como .tar.gz e .tar.bz2 — tar cuidando do empacotamento, e outro programa cuidando da compressão.

tar moderno já integra essa combinação através de flags diretas, sem precisar rodar dois comandos separados:

tar -czvf backup.tar.gz Documentos/     # compressão com gzip (-z)
tar -cjvf backup.tar.bz2 Documentos/    # compressão com bzip2 (-j)
tar -cJvf backup.tar.xz Documentos/     # compressão com xz (-J)

E, na extração, tar detecta automaticamente qual algoritmo foi usado — não é preciso lembrar qual flag de compressão usar na hora de extrair, -xvf sozinho já resolve para qualquer um dos formatos:

tar -xvf backup.tar.gz
tar -xvf backup.tar.bz2
tar -xvf backup.tar.xz

gzip vs. bzip2 vs. xz: qual escolher

Essa é uma dúvida prática recorrente, e a resposta depende do que se está otimizando — velocidade ou taxa de compressão:

  • gzip — o mais rápido dos três, e o mais universalmente disponível (praticamente todo sistema Unix tem gzip instalado por padrão). Taxa de compressão razoável, mas não a melhor. É a escolha padrão quando velocidade importa mais que o tamanho final — por exemplo, comprimir logs rotacionados automaticamente todo dia.
  • bzip2 — comprime melhor que gzip na maioria dos casos, mas é sensivelmente mais lento, tanto para comprimir quanto para descomprimir. Faz sentido quando o espaço economizado compensa o tempo extra — arquivamento de longo prazo, por exemplo, onde a compressão roda uma vez só, mas o arquivo fica armazenado por muito tempo.
  • xz — geralmente a melhor taxa de compressão dos três, mas o mais lento e o que mais consome memória durante a compressão. Comum em distribuição de pacotes de software (é o formato usado pelo próprio kernel Linux, por exemplo), onde o tamanho final do arquivo distribuído importa mais do que o tempo gasto para gerá-lo uma única vez.

Uma forma prática de decidir, sem precisar decorar: se o arquivo vai ser comprimido com frequência (rotina automatizada, muitas vezes ao dia), priorize velocidade (gzip). Se vai ser comprimido uma vez e armazenado/distribuído por muito tempo, priorize taxa de compressão (xz ou bzip2).

Usando gzip e bzip2 diretamente, sem tar

Os comandos gzip e bzip2 também funcionam sozinhos, comprimindo um único arquivo — sem empacotar vários arquivos, já que essa não é a função deles:

gzip arquivo.log
# gera arquivo.log.gz, e REMOVE o arquivo.log original

Esse comportamento — remover o arquivo original — costuma surpreender quem usa pela primeira vez. Para manter o original intacto e gerar a versão comprimida como uma cópia separada:

gzip -k arquivo.log
# -k (keep): mantém o arquivo.log original, além de gerar arquivo.log.gz

Para descomprimir:

gunzip arquivo.log.gz
# ou, equivalente:
gzip -d arquivo.log.gz

O mesmo padrão se aplica ao bzip2:

bzip2 -k arquivo.log       # comprime, mantendo o original
bunzip2 arquivo.log.bz2    # descomprime

Verificando o conteúdo de um arquivo comprimido sem descomprimir

Uma dupla de comandos pouco conhecida, mas bastante prática para investigar logs comprimidos sem precisar descomprimir o arquivo inteiro primeiro:

zcat arquivo.log.gz | grep "ERROR"
# lê o conteúdo comprimido diretamente, direcionando para outro comando

Isso conecta diretamente com o artigo sobre grep — é bastante comum, em investigação de logs antigos já rotacionados e comprimidos, precisar buscar um padrão sem ocupar espaço extra descomprimindo o arquivo primeiro. zcat (para .gz) e bzcat (para .bz2) resolvem exatamente isso, agindo como uma ponte entre o arquivo comprimido e qualquer outro comando via pipe.

zip e unzip: quando a compatibilidade com outros sistemas importa

Diferente de tar + gzip/bzip2 (dois passos separados, típico do mundo Unix), o .zip já combina arquivamento e compressão num formato único — e é o formato mais universalmente reconhecido fora do mundo Linux, especialmente por usuários de Windows e macOS.

zip -r backup.zip Documentos/

-r (recursive) é necessário para incluir o conteúdo de subdiretórios — sem ela, zip só adicionaria os arquivos do nível mais alto de Documentos/, ignorando o que estiver dentro de subpastas.

Extraindo:

unzip backup.zip

Para extrair num diretório específico:

unzip backup.zip -d /destino/

Para listar o conteúdo sem extrair (equivalente ao tar -tvf):

unzip -l backup.zip

Quando usar zip em vez de tar + gzip

A regra prática: use .zip quando o arquivo vai ser compartilhado com alguém que provavelmente não está em um sistema Unix, ou quando a ferramenta de destino (um sistema de upload, uma API, um cliente que só aceita .zip) exige esse formato especificamente. Para backups, transferências entre servidores Linux, e arquivamento dentro do próprio ecossistema Unix, tar combinado com gzip/bzip2/xz é o padrão mais nativo, mais flexível (preserva melhor permissões e links simbólicos do Unix) e, no caso do gzip, quase sempre disponível sem precisar instalar nada extra.

Exemplos práticos do dia a dia

# Backup completo do diretório pessoal, com data no nome do arquivo
tar -czvf backup_home_$(date +%Y%m%d).tar.gz ~/

# Extrair um pacote baixado, direto no diretório de destino desejado
tar -xzvf pacote.tar.gz -C /opt/aplicacao/

# Compactar todos os logs de um diretório, individualmente
gzip /var/log/app/*.log

# Buscar um erro específico dentro de um log já compactado
zcat /var/log/app/antigo.log.gz | grep "Traceback"

# Criar um zip para enviar um projeto a alguém fora do ambiente Linux
zip -r projeto.zip meu_projeto/ -x "*.git*" -x "__pycache__/*"

# Conferir o conteúdo de um tar.gz antes de extrair, por segurança
tar -tzvf pacote_desconhecido.tar.gz

No exemplo do zip, a flag -x exclui padrões da compactação — parecido em espírito com o --exclude do rsync visto no artigo anterior, útil para não empacotar arquivos irrelevantes (controle de versão, cache) junto com o projeto de verdade.

Boas práticas

  • Sempre liste o conteúdo (-t no tar, -l no unzip) antes de extrair um arquivo de origem desconhecida — evita extrair um número inesperado de arquivos direto no diretório atual, ou pior, sobrescrever algo sem perceber.
  • Use -C no tar ao extrair, para controlar exatamente onde os arquivos vão parar, em vez de depender de estar no diretório certo antes de rodar o comando.
  • Prefira gzip -k e bzip2 -k quando quiser manter o arquivo original — o comportamento padrão de remover o original surpreende bastante gente na primeira vez.
  • Escolha o algoritmo pela frequência de uso: gzip para rotinas automatizadas e frequentes, xz/bzip2 para arquivamento único de longo prazo onde o tamanho final importa mais que o tempo de compressão.
  • Use zcat/bzcat combinado com grep para investigar logs comprimidos sem precisar descomprimir o arquivo inteiro primeiro — economiza espaço em disco e um passo manual.
  • Use .zip apenas quando a compatibilidade fora do Unix for necessária — para uso interno entre servidores Linux, tar + compressão continua sendo mais idiomático e mais completo na preservação de metadados.
  • Inclua a data no nome de arquivos de backup ($(date +%Y%m%d)), especialmente em scripts agendados via cron — evita sobrescrever o backup anterior sem perceber.

Conclusão

A separação entre arquivar (tar) e comprimir (gzip/bzip2/xz) parece, à primeira vista, uma complicação desnecessária para quem vem de sistemas onde o .zip já faz tudo junto. Na prática, é o oposto: separar as duas responsabilidades dá flexibilidade — trocar o algoritmo de compressão sem mudar a forma de empacotar, ou usar só um dos dois quando o outro não for necessário. Entender essa distinção, e saber quando cada ferramenta (incluindo o .zip, para os casos certos) é a mais adequada, é exatamente o tipo de conhecimento fundamental que a LPI Essentials cobra — e que continua sendo usado o tempo todo, muito depois da prova, em qualquer rotina real de administração de sistemas Linux.