Compactação e arquivamento
Nesta aula, você aprenderá a compactar e arquivar arquivos no Linux usando tar, gzip, gunzip, zip e unzip, além de combinar essas ferramentas para criar backups eficientes. Vamos explorar os comandos fundamentais, opções importantes e boas práticas para gerenciar arquivos compactados.
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 -czfpara 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
-vpara ver o progresso:tar -xzvf arquivo.tar.gz. - Para preservar permissões e propriedade, o
taré melhor que ozip. - Em scripts, verifique se o comando foi bem-sucedido usando
echo $?ou estruturas condicionais.
Referências
- GNU tar Manual
- GNU gzip Manual
- zip man page
- unzip man page
- GNU Coreutils (inclui gzip, gunzip)
- Advanced Bash-Scripting Guide: Archiving
- Cyberciti: Compress a directory in Linux
Exercícios
Crie um diretório chamado
projetocom três arquivos de texto (a.txt,b.txt,c.txt). Crie um arquivoprojeto.tarcontendo 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.tarCompacte o arquivo
projeto.tarusandogzipe depois descompacte comgunzip. 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.tarCrie um arquivo
projeto.zipcontendo o diretórioprojeto(recursivamente). Liste o conteúdo do zip e extraia em um diretório chamadoextraido.✓ Resposta:zip -r projeto.zip projeto/ unzip -l projeto.zip mkdir extraido unzip projeto.zip -d extraidoCrie um backup compactado
backup.tar.gzdo diretórioprojetousandotarcom a opção-z. Depois extraia em um diretório chamadorestaurado.✓ Resposta:tar -czf backup.tar.gz projeto/ mkdir restaurado tar -xzf backup.tar.gz -C restauradoEscreva um script shell que crie um backup diário do diretório
/home/usuario/documentosem/backupcom o nomedocumentos-$(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