Existem duas tarefas distintas, mas relacionadas. O empacotamento de uma árvore de arquivos (incluindo nomes de arquivos, estrutura de diretórios, permissões do sistema de arquivos, propriedade e outros metadados) em um fluxo de bytes é chamado de
arquivamento . A remoção de redundância em um fluxo de bytes para produzir um fluxo de bytes menor é chamada de compactação .
No Unix, as duas operações são separadas, com ferramentas distintas para cada uma. Na maioria das outras plataformas (atuais e históricas), as ferramentas combinadas executam arquivamento e compactação.
(gzip e outros programas que imitam a interface do gzip geralmente têm a opção de armazenar o nome do arquivo original na saída compactada, mas esse, juntamente com um CRC ou outra verificação para detectar corrupção, é o único metadado que eles podem armazenar.)
Há vantagens em separar a compactação do arquivamento. O arquivamento é específico da plataforma (os metadados do sistema de arquivos que precisam ser preservados variam muito), mas a implementação é direta, basicamente ligada à E / S e muda pouco ao longo do tempo. A compactação é independente da plataforma, mas as implementações são vinculadas à CPU e os algoritmos estão em constante aprimoramento para aproveitar o aumento de recursos que o hardware moderno pode trazer para o problema.
O arquivador Unix mais popular é tar
, embora existam outros como cpio
e ar
. (Pacotes Debian são ar
arquivos, embora
cpio
seja frequentemente usado para ramdisks iniciais.) tar
É ou foi frequentemente combinado com ferramentas de compactação como compress
(.Z), gzip
(.gz),
bzip2
(.bz2) e xz
(.xz), do mais antigo ao mais novo e não por coincidência da pior para a melhor compactação.
Criar um tar
arquivo e compactá-lo são etapas distintas: o compressor não sabe nada sobre o tar
formato do arquivo. Isso significa que extrair um único arquivo de um tar
arquivo compactado exige descompactar todos os arquivos anteriores. Isso geralmente é chamado de arquivo "sólido".
Da mesma forma, como o tar é um formato de "streaming" - necessário para que seja útil em um pipeline - não há índice global em um arquivo tar, e listar o conteúdo de um arquivo tar é tão caro quanto extraí-lo.
Por outro lado, o Zip, o RAR e o 7-zip (os arquivadores mais populares nas plataformas modernas do Windows) geralmente compactam cada arquivo separadamente e compactam os metadados levemente, se houver. Isso permite a listagem barata dos arquivos em um archive e a extração de arquivos individuais, mas significa que a redundância entre vários arquivos no mesmo archive não pode ser explorada para aumentar a compactação. Enquanto, em geral, compactar um arquivo já compactado não reduz ainda mais o tamanho do arquivo, ocasionalmente você pode ver um arquivo zip dentro de um arquivo zip: o primeiro compactar transformou muitos arquivos pequenos em um arquivo grande (provavelmente com a compactação desativada), e o segundo compactar e depois compactar como uma única entidade.
Há polinização cruzada entre as diferentes plataformas e filosofias: gzip
é essencialmente zip
o compressor sem seu arquivador e xz
é essencialmente 7-zip
o compressor sem seu arquivador.
Existem outros compressores especializados. As variantes de PPM e seus sucessores ZPAQ
são otimizados para máxima compactação sem levar em consideração o consumo de recursos. Eles podem consumir facilmente a CPU e a RAM que você puder usar, e a descompressão é tão cansativa quanto a compactação (por outro lado, as ferramentas de compactação mais usadas são
assimétricas : a descompactação é mais barata que a compactação).
Na outra extremidade do espectro, lzo
, snappy
e LZ4
são compressores "leves" concebidos para uma velocidade máxima e mínima do consumo de recursos, ao custo de compressão. Eles são amplamente utilizados em sistemas de arquivos e outros armazenamentos de objetos, mas menos como ferramentas independentes.
Então, qual você deve escolher?
Arquivamento:
Como você está no Ubuntu, não há motivo real para usar outra coisa senão o tar
arquivamento, a menos que você esteja tentando criar arquivos que sejam facilmente legíveis em outros lugares.
zip
é difícil de superar pela onipresença, mas não é centrado no Unix e não mantém as permissões do sistema de arquivos e as informações de propriedade, e sua compactação é antiquada. 7-zip e RAR (e ZPAQ) têm compactação mais moderna, mas são igualmente inadequados para arquivar sistemas de arquivos Unix (embora não haja nada que o impeça de usá-los apenas como compressores); O RAR também é proprietário.
Compressão:
Para uma compactação máxima, você pode dar uma olhada em um benchmark, como o enorme em http://mattmahoney.net/dc/text.html . Isso deve lhe dar uma idéia melhor das trocas envolvidas.
Você provavelmente não quer uma compressão máxima, no entanto. É muito caro.
xz
é a ferramenta de compactação de uso geral mais popular nos sistemas Unix modernos. Eu acredito que o 7-zip também pode ler arquivos xz, pois eles estão intimamente relacionados.
Finalmente: se você estiver arquivando dados para algo que não seja armazenamento de curto prazo, escolha algo de código aberto e de preferência generalizado, para minimizar dores de cabeça posteriormente.