Pacotes tar e gzip
O tar junta vários arquivos num só, o gzip comprime um arquivo; .tar.gz é os dois, e o comando file diz o que cada arquivo é.
Duas ferramentas antigas fazem trabalhos diferentes e quase sempre andam juntas:
- o tar junta uma pasta inteira (arquivos, subpastas, datas, permissões) num arquivo só, sem comprimir nada. É o fardo amarrado;
- o gzip comprime um arquivo, de qualquer tipo. É o fardo prensado.
Por isso o pacote comum no Linux é .tar.gz (ou .tgz): primeiro o tar junta, depois o gzip comprime. Para abrir, o caminho é o inverso, e o tar faz as duas coisas de uma vez:
$ tar -tzf colheita.tar.gz
colheita/
colheita/uvas.txt
$ tar -xzf colheita.tar.gz
$ ls
colheita colheita.tar.gz
As letras: x extrai (extract), t só lista, c cria, z passa pelo gzip, v mostra os detalhes e f avisa que o próximo argumento é o arquivo. Sem o z, tar -xf abre um tar que não está comprimido.
O gzip sozinho: gzip -dc arquivo > saida descomprime (-d) e escreve o resultado na tela (-c), que o > desvia para um arquivo novo. O gunzip arquivo.gz faz o mesmo, mas só aceita nomes que terminam em .gz.
Quando o nome mente. A extensão é só parte do nome. Para saber o que um arquivo é de verdade, pergunte ao file, que lê os primeiros bytes (veja o conceito Assinatura de arquivo):
$ file colheita.tar.gz foto.png dados
colheita.tar.gz: gzip compressed data
foto.png: ASCII text
dados: POSIX tar archive
Um arquivo pode vir embrulhado em várias camadas. O método é sempre o mesmo: perguntar ao file, desfazer a camada que ele aponta, gravar o resultado num arquivo novo e perguntar ao file de novo.
O file diz |
Desfaça com |
|---|---|
gzip compressed data |
gzip -dc entrada > saida |
POSIX tar archive |
tar -xf entrada |
ASCII text, só letras, números, + e /, às vezes = no fim |
base64 -d < entrada > saida |
No macOS, tar, gzip -dc, file e base64 -d funcionam igual (em versões antigas do macOS, o base64 usa -D no lugar de -d). Em Python, os módulos tarfile, gzip e base64 desfazem cada camada.