Compactação e arquivamento são tarefas essenciais para qualquer usuário de Linux, seja para reduzir o espaço em disco, facilitar a transferência de arquivos ou criar backups. Nesta aula, vamos dominar as ferramentas mais comuns: tar para arquivamento, gzip/gunzip para compactação individual, e zip/unzip para compatibilidade com outros sistemas. Também veremos como combiná-las para criar arquivos compactados com eficiência.

Entender a diferença entre arquivar e compactar é fundamental: arquivar junta vários arquivos em um só (sem reduzir tamanho), enquanto compactar reduz o tamanho dos dados. O tar é um arquivador, mas pode ser combinado com compactadores como gzip ou bzip2 para produzir arquivos .tar.gz ou .tar.bz2.

tar

O comando tar (Tape Archive) é a ferramenta padrão para arquivamento no Linux. Ele cria um arquivo único contendo vários arquivos e diretórios, preservando permissões, timestamps e estrutura de diretórios. O tar não compacta por padrão; ele apenas concatena os dados.

A sintaxe básica é tar [opções] [arquivo-destino] [arquivos-origem]. As opções mais comuns incluem -c (create), -x (extract), -f (file) e -v (verbose). Para compactar, usamos -z (gzip), -j (bzip2) ou -J (xz).

Exemplo: criar um arquivo backup.tar com o diretório documentos:

tar -cf backup.tar documentos/

Para extrair:

tar -xf backup.tar

Para listar o conteúdo sem extrair:

tar -tf backup.tar

gzip e gunzip

O gzip é um compactador de arquivos individuais, substituindo o arquivo original por uma versão compactada com extensão .gz. O gunzip (ou gzip -d) descompacta. Ele usa o algoritmo DEFLATE e é muito rápido, sendo ideal para arquivos de texto e logs.

Exemplo: compactar um arquivo meu_arquivo.txt:

gzip meu_arquivo.txt

Isso cria meu_arquivo.txt.gz e remove o original. Para descompactar, use gunzip meu_arquivo.txt.gz.

O gzip também pode ser usado em conjunto com tar para compactar arquivos, mas a prática comum é usar a opção -z do próprio tar, que internamente chama o gzip.

zip/unzip

O zip é um formato amplamente suportado em vários sistemas operacionais (Windows, macOS, Linux). O comando zip cria arquivos compactados, e unzip extrai. Ele é útil para compartilhar arquivos com usuários de outros sistemas.

Exemplo: criar um arquivo arquivos.zip com dois arquivos:

zip arquivos.zip arquivo1.txt arquivo2.txt

Para extrair:

unzip arquivos.zip

Para listar o conteúdo:

unzip -l arquivos.zip

O zip também pode compactar diretórios recursivamente:

zip -r backup.zip documentos/

Combinações

Na prática, é comum combinar tar com gzip, bzip2 ou xz para criar arquivos compactados. O tar primeiro arquiva os arquivos e depois o compactador reduz o tamanho. As opções -z, -j e -J do tar fazem isso automaticamente.

Exemplos:

# Criar backup.tar.gz (compactado com gzip)
tar -czf backup.tar.gz documentos/

# Criar backup.tar.bz2 (compactado com bzip2, melhor compressão)
tar -cjf backup.tar.bz2 documentos/

# Criar backup.tar.xz (compactação extrema)
tar -cJf backup.tar.xz documentos/

Para extrair, use as mesmas opções com -x:

tar -xzf backup.tar.gz
tar -xjf backup.tar.bz2
tar -xJf backup.tar.xz

Também é possível combinar tar com zip usando tar para arquivar e depois zip para compactar, mas isso é menos comum. Uma alternativa é usar o zip diretamente com -r para diretórios, como visto acima.

Outra combinação útil é usar gzip em um arquivo tar sem a opção -z, mas isso é redundante. O importante é escolher a ferramenta certa para o contexto: tar.gz é o padrão no Linux, enquanto zip é melhor para interoperabilidade.

Boas práticas

  • Use tar -czf para backups diários, pois é rápido e amplamente suportado.
  • Para máxima compressão (ex.: arquivos de log antigos), use tar -cJf (xz).
  • Sempre teste a integridade do arquivo após criar com tar -tzf arquivo.tar.gz (ou similar).
  • Ao extrair, use -v para ver o progresso: tar -xzvf arquivo.tar.gz.
  • Para preservar permissões e propriedade, o tar é melhor que o zip.
  • Em scripts, verifique se o comando foi bem-sucedido usando echo $? ou estruturas condicionais.

Referências

Exercícios

  1. Crie um diretório chamado projeto com três arquivos de texto (a.txt, b.txt, c.txt). Crie um arquivo projeto.tar contendo esse diretório. Liste o conteúdo do arquivo tar.

    ✓ Resposta:
    mkdir projeto
    touch projeto/a.txt projeto/b.txt projeto/c.txt
    tar -cf projeto.tar projeto/
    tar -tf projeto.tar
  2. Compacte o arquivo projeto.tar usando gzip e depois descompacte com gunzip. Verifique que o arquivo original foi restaurado.

    ✓ Resposta:
    gzip projeto.tar
    # agora existe projeto.tar.gz
    ls -l projeto.tar.gz
    gunzip projeto.tar.gz
    # projeto.tar foi restaurado
    ls -l projeto.tar
  3. Crie um arquivo projeto.zip contendo o diretório projeto (recursivamente). Liste o conteúdo do zip e extraia em um diretório chamado extraido.

    ✓ Resposta:
    zip -r projeto.zip projeto/
    unzip -l projeto.zip
    mkdir extraido
    unzip projeto.zip -d extraido
  4. Crie um backup compactado backup.tar.gz do diretório projeto usando tar com a opção -z. Depois extraia em um diretório chamado restaurado.

    ✓ Resposta:
    tar -czf backup.tar.gz projeto/
    mkdir restaurado
    tar -xzf backup.tar.gz -C restaurado
  5. Escreva um script shell que crie um backup diário do diretório /home/usuario/documentos em /backup com o nome documentos-$(date +%Y%m%d).tar.gz. O script deve verificar se o diretório existe e exibir uma mensagem de sucesso ou erro.

    ✓ Resposta:
    #!/bin/bash
    
    ORIGEM="/home/usuario/documentos"
    DESTINO="/backup"
    NOME="documentos-$(date +%Y%m%d).tar.gz"
    
    if [ -d "$ORIGEM" ]; then
        mkdir -p "$DESTINO"
        tar -czf "$DESTINO/$NOME" "$ORIGEM"
        if [ $? -eq 0 ]; then
            echo "Backup criado com sucesso: $DESTINO/$NOME"
        else
            echo "Erro ao criar backup."
            exit 1
        fi
    else
        echo "Diretório de origem não encontrado: $ORIGEM"
        exit 1
    fi