Saltar para o conteúdo
010 · Linux Essentials

Empacotando arquivos na linha de comando

TópicoT09Objetivo3.1Peso2PáginasLinux Essentials (010) - Version 4.1

Resumo Conciso

A compressão reduz o espaço/banda consumidos por dados, substituindo padrões repetitivos. O empacotamento agrupa vários ficheiros/diretórios num só ficheiro (útil para backups, código-fonte, retenção). Em Linux usam-se em conjunto, mas são conceitos distintos.

Compressão — sem perda vs. com perda

  • Sem perda (lossless): recuperável, byte a byte. gzip, bzip2, xz — as ferramentas da Lição.
  • Com perda (lossy): imagens, vídeo, áudio (perda impercetível).
  • Trade-off: maior taxa de compressão = mais CPU/tempo (procura padrões mais complexos).

Ferramentas de compressão (uma por ficheiro, não empacotam)

FerramentaComprimirDescomprimirExtensãoPrefixo p/ ferramentas de texto
gzipgzipgunzip.gzz (zcat, zgrep, zless…)
bzip2bzip2bunzip2.bz2bz (bzcat, bzgrep…)
xzxzunxz.xzxz (xzcat, xzgrep…)
  • Após comprimir, o ficheiro original é removido (fica só o .gz/.bz2/.xz); ao descomprimir, o comprimido é removido.
  • Níveis de compressão: -1 (rápido, compressão menor) … -9 (lento, compressão maior). Suportados por gzip e xz.
  • Algoritmos incompatíveis entre si — um .gz só é lido por ferramentas gzip.
  • As ferramentas de texto "com prefixo" permitem ler sem descomprimir (ex.: zcat hosts.gz).

tar — empacotamento (tape archive)

O tar gerencia o pacote, mas não comprime por si só (embora possa chamar um compressor). Os pacotes chamam-se tar balls. Na versão GNU, o - antes das opções é opcional.

OpçãoAção
ccriar pacote
xextrair
tlistar conteúdo
fnome do ficheiro (vem sempre a seguir às opções)
vverbose (lista os ficheiros processados)
uadicionar/substituir ficheiros (só em pacotes não comprimidos)
zgzip
jbzip2
Jxz
Pmanter a / inicial em caminhos absolutos (perigoso)

Padrões comuns:

bash
tar -cvzf pacote.tar.gz diretorio      # criar (gzip)tar -xvzf pacote.tar.gz                # extrairtar -tvzf pacote.tar.gz                # listartar -xvzf pacote.tar.gz diretorio/f   # extrair só um ficheiro
  • Ao extrair, o tar preserva os caminhos relativos e sobrescreve ficheiros existentes.
  • Não é possível atualizar (tar uf) pacotes comprimidos → erro tar: Cannot update compressed archives. Solução: descomprimir → adicionar → recomprimir.
  • Sempre que o .tar for comprimido, acrescentar a extensão do algoritmo (.tar.gz, .tar.bz2, .tar.xz, ou formas curtas como .tgz).

zip / unzip — interoperabilidade com Windows

  • Um ZIP é simultaneamente pacote + compressão (equivale a um tar comprimido).
  • zip -r arq.zip diretorio — o -r é indispensável para incluir o conteúdo dos diretórios.
  • unzip arq.zip extrai; unzip -l arq.zip lista o conteúdo.
  • Suporta níveis -0 (sem compressão) a -9 (máxima); padrão -6.
  • Podem não vir instalados por defeito (repositório das distros).
archive.tar????
archive.tgz????
archive.tar.xz????

Solução:

Nome do ficheirotargzipbzip2xz
archive.tarX
archive.tgzXX
archive.tar.xzXX

.tgz é a forma curta de .tar.gz.

Guiado 2 — Empacotado vs. comprimido

Enunciado: Quais destes ficheiros estão empacotados e quais estão comprimidos?

Nome do ficheiroEmpacotadoComprimido
file.tar??
file.tar.bz2??
file.zip??
file.xz??

Solução:

Nome do ficheiroEmpacotadoComprimido
file.tarX
file.tar.bz2XX
file.zipXX
file.xzX

Guiado 3 — Adicionar um ficheiro a um tar comprimido com gzip

Enunciado: Como se adiciona um ficheiro a um ficheiro tar comprimido com gzip?

Solução: Não dá para adicionar diretamente (tar recusa atualizar pacotes comprimidos). Processo em 3 passos:

  1. Descomprimir com gunzip
  2. Adicionar com tar uf
  3. Recomprimir com gzip
bash
gunzip pacote.tar.gz        # -> pacote.tartar uf pacote.tar novo.txt  # adiciona novo.txtgzip pacote.tar             # -> pacote.tar.gz

Guiado 4 — Opção de tar para caminhos absolutos

Enunciado: Qual opção de tar instrui o tar a incluir o caractere inicial / nos caminhos absolutos?

Solução: A opção -P (--absolute-names), que impede o tar de remover a barra inicial:

bash
-P, --absolute-names    Don't strip leading slashes from file names when creating archives

⚠️ Perigoso: ao extrair pode sobrescrever ficheiros de sistema importantes.

Guiado 5 — O zip suporta níveis de compressão?

Enunciado: O zip suporta diferentes níveis de compressão?

Solução: Sim, via -# com # de 0 a 9:

  • -0 — sem compressão (só armazena)
  • -1 — compressão mais rápida (menor rácio)
  • -9 — compressão mais lenta (melhor rácio)
  • Padrão: -6
bash
zip -9 maximo.zip ficheiro    # máxima compressão

🔬 Exercícios Exploratórios (prática no terminal)

Exercícios da autoria do agente. Consolidam o tópico 3.1 (compressão, tar, zip, zcat). Dica: cria um diretório de testes ~/lab31. As soluções estão em <details>.

Exploratório 1 — Comparar o rácio de compressão das 3 ferramentas

Cria um ficheiro grande a partir de /etc, faz 3 cópias e comprime cada uma com gzip, bzip2 e xz. Compara os tamanhos finais com ls -lh.

bash
mkdir -p ~/lab31/compressao && cd ~/lab31/compressao# Ficheiro grande (conteúdo textual de /etc)cat /etc/*.conf > dados.txt 2>/dev/null# 3 cópias idênticascp dados.txt dados_gzcp dados.txt dados_bzcp dados.txt dados_xz# Comprimir cada uma com ferramenta diferentegzip dados_gzbzip2 dados_bzxz dados_xz# Compararls -lh

Resultado esperado (típico): o dados_xz.xz é o mais pequeno (xz costuma ter melhor rácio), seguido de .bz2 e .gz. Repara que os ficheiros .txt originais das cópias desapareceram após compressão — só o dados.txt (não comprimido) permanece.

Exploratório 2 — Ciclo completo de um tar.gz (criar/listar/extrair)

Empacota o diretório compressao num backup.tar.gz, lista o seu conteúdo sem extrair e extrai-o numa pasta restauro.

bash
cd ~/lab31# Criar (c=create, v=verbose, z=gzip, f=ficheiro)tar -cvzf backup.tar.gz compressao# Listar conteúdo (t=list) sem extrairtar -tvzf backup.tar.gz# Extrair (x=extract) numa pasta limpamkdir -p restauro && cd restaurotar -xvzf ../backup.tar.gzls -R

Aprendido: as letras da opção ditam a operação — c/x/t (criar/extrair/listar), sempre com f (nome do ficheiro) e z (gzip) neste caso.

Exploratório 3 — Ler ficheiro comprimido sem descomprimir (zcat)

Comprime o /etc/hosts com gzip e lê o conteúdo diretamente com zcat, sem o descomprimir.

bash
cd ~/lab31/compressaocp /etc/hosts .gzip hosts                # -> hosts.gz# Ler sem descomprimirzcat hosts.gz

Resultado: o conteúdo do hosts aparece no terminal, mas o ficheiro continua comprimido (ls mostra hosts.gz). Existem variantes equivalentes: bzcat (bzip2) e xzcat (xz).

Exploratório 4 — zip/unzip com diretórios

Cria uma estrutura com subpastas, fecha-a num projeto.zip, elimina o original e extrai de volta. Confirma que a opção -r foi necessária.

bash
cd ~/lab31mkdir -p zipproj/notas zipproj/imgecho "reuniao 14h" > zipproj/notas/a.txtecho "tarefas"    > zipproj/notas/b.txttouch zipproj/img/diagrama.png# -r inclui o conteúdo das subpastaszip -r projeto.zip zipproj# Remover o original e extrairrm -rf zipprojunzip -l projeto.zip     # listar antesunzip projeto.zipfind zipproj

Aprendido: sem -r, o zip armazenaria apenas o diretório vazio. O unzip -l lista o conteúdo sem extrair (equivalente ao tar -tf).

Exploratório 5 — Extrair um único ficheiro de um tarball

A partir do backup.tar.gz do Exploratório 2, extrai apenas o ficheiro compressao/dados.txt, deixando o resto intocado.

bash
cd ~/lab31/restaurorm -rf compressao         # garantir que começa limpo# Indicar o caminho do ficheiro após o nome do pacotetar -xvzf ../backup.tar.gz compressao/dados.txtls compressao             # mostra apenas dados.txt

Aprendido: basta indicar o caminho do ficheiro desejado a seguir ao nome do pacote. Vários ficheiros podem ser listados de uma vez. O caminho tem de corresponder ao que o tar -t mostra.