Eu sempre usei TAR e ZIP para compactação, mas recentemente ouvi falar sobre o *.Z
algoritmo de compactação. Isso me trouxe uma pergunta:
Com todos esses sistemas de compactação, qual é o melhor para uso geral e compactação?
Executando alguns testes, descobri que tar
, como descobri, NÃO é realmente compactado (a menos que especificado explicitamente). Significado, para que serve se comparado a outros métodos de compactação?
Já estou ciente de que ZIP é o sistema de compressão mais utilizado, mas devo usá-lo em vez de *.Z
, *.7z
, .tar
ou .tar.<insert ending here>
?
Resumo da publicação:
- Devo usar
*.tar
,*.Z
,*.7z
,.tar
, ou.tar.<insert ending here>
para a melhor compressão? - Se a planície
*.tar
não é compactada, por que a usamos?
EDIT: Nem todos os algoritmos permitem armazenar permissões do Linux (pelo que aprendi). Quais são e existe algum tipo de hack (ou script) que eu poderia usar para armazenar permissões?
fonte
Respostas:
tar
significa arquivo de fita. Tudo o que faz é empacotar arquivos e seus metadados (permissões, propriedade etc.) em um fluxo de bytes que podem ser armazenados em uma unidade de fita (ou em um arquivo) e restaurados posteriormente. A compactação é uma questão totalmente separada que você costumava canalizar a saída através de um utilitário externo para compactar, se quisesse. O tar do GNU foi bom o suficiente para adicionar opções para dizer a ele para filtrar automaticamente a saída através do utilitário apropriado como um atalho.Zip e 7z combinam o arquivamento e a compactação em seu próprio formato de contêiner e destinam-se a compactar arquivos em um sistema DOS / Windows, para que não armazenem permissões e propriedade unix. Portanto, se você deseja armazenar permissões para backups adequados, é necessário manter o tar. Se você planeja trocar arquivos com usuários do Windows, o zip ou o 7z é bom. Os algoritmos de compactação reais, zip e 7zip, podem ser usados com tar, por uzing
gzip
elzma
respectivamente.O lzma (também conhecido como * .xz) possui uma das melhores taxas de compactação e é bastante rápido na descompactação, tornando-a a melhor opção atualmente. No entanto, exige uma tonelada de memória RAM e tempo de CPU para compactar. O venerável
gzip
é um pouco mais rápido na compactação, portanto, pode ser usado se você não quiser dedicar tanto tempo de CPU. Ele também possui uma variante ainda mais rápida chamada lzop.bzip2
ainda é bastante popular, pois substituiu o gzip por um tempo antes da criação do 7zip / lzma, uma vez que obteve melhores taxas de compactação, mas está desvalorizando atualmente, já que o 7z / lzma é mais rápido na descompressão e obtém melhores taxas de compactação. Ocompress
utilitário, que normalmente nomeia arquivos * .Z, é antigo e há muito esquecido.Uma das outras diferenças importantes entre zip e tar é que o zip compacta os dados em pequenos pedaços, enquanto que ao compactar um arquivo tar, você comprime tudo de uma vez. O último fornece melhores taxas de compactação, mas para extrair um único arquivo no final do arquivo, você deve descompactar tudo para obtê-lo. Assim, o formato zip é melhor para extrair um ou dois arquivos de um arquivo grande. 7z e
dar
permita que você escolha comprimir a coisa toda (chamada modo "sólido") ou pequenos pedaços para facilitar a extração por partes.fonte
gzip
.tar cfp
preservará as permissões. Um arquivo tar é descompactado, portanto, zip (7-zip), gzip2, gzip, lzo, etc compactará bem um arquivo tar (em geral, é improvável que um tar de arquivos compactados seja compactável).Os detalhes dos algoritmos estão fora de tópico aqui 1, uma vez que não são de forma alguma específicos para o Linux, muito menos para o Ubuntu. Você encontrará, no entanto, algumas informações interessantes aqui .
Agora
tar
, como você disse,tar
não é e nunca foi um programa de compactação. Em vez disso, é um arquivador ; seu objetivo principal é criar um arquivo grande dentre muitos pequenos. Historicamente, isso era para facilitar o armazenamento em unidades de fita, daí o nome: Tape ARchive.Hoje, o principal motivo para usar
tar
é diminuir o número de arquivos no seu sistema. Cada arquivo em um sistema de arquivos Unix ocupa um inode , quanto mais arquivos você tiver, menos inodes disponíveis e quando você ficar sem inodes, não será mais possível criar novos arquivos. Simplificando, a mesma quantidade de dados armazenados como milhares de arquivos ocupará mais do seu disco rígido do que os mesmos arquivos em um único arquivo tar.Para ilustrar, como isso foi contestado nos comentários, na minha
/
partição 68G , tenho o seguinte número de inodes totais e usados (lembre-se de que a contagem de inodes depende do tipo de sistema de arquivos e do tamanho da partição):Se eu agora tentar criar mais arquivos do que os inodes:
Não há espaço? Mas eu tenho muito espaço:
Como você pode ver acima, a criação de algumas centenas de milhares de arquivos vazios esgota rapidamente meus inodes e não posso mais criar novos. Se eu fosse a
tar
esses, seria capaz de começar a criar arquivos novamente.Ter menos arquivos também acelera bastante a E / S do sistema de arquivos, especialmente em sistemas de arquivos montados em NFS. Eu sempre tar meus diretórios de trabalho antigos quando um projeto é concluído, uma vez que, quanto menos arquivos eu tenho, mais rápidos os programas como
find
ele funcionam.Há uma ótima resposta sobre o Superusuário que entra em muito mais detalhes, mas, além do exposto, os outros motivos básicos pelos quais
tar
ainda hoje são populares são:Eficiência: usar
tar
para canalizar através de um programa de compactaçãogzip
é mais eficiente, pois evita a criação de arquivos intermediários.tar
vem com todos os tipos de sinos e assobios, recursos que foram projetados ao longo de sua longa história que o tornam particularmente útil para backups * nix (permissões de permissões, propriedade de arquivos, a capacidade de canalizar dados diretamente para STDOUT e por um link SSH ... )Inércia. Estamos acostumados
tar
. É seguro assumir que ele estará disponível em qualquer * nix que você possa usar, o que o torna muito portátil e útil para tarballs de código-fonte.1 Isso é absolutamente verdade e não tem nada a ver com o fato de eu não saber o suficiente sobre eles para explicar :)
fonte
tar
para "reduzir o número de arquivos", já que a maioria dos sistemas de arquivos não se importa, e isso não é o ideal, poistar
não suporta fácil acesso aleatório a arquivos. Em vez disso, o principal uso (para mim e para a maioria das pessoas) é compartilhar arquivos (por exemplo, código fonte) com outras pessoas de uma maneira simples.ARG_MAX
, isso pode tornar o tratamento dos arquivos de qualquer maneira um aborrecimento e pode realmente trazer uma rede (mal) configurada, na qual os arquivos são armazenados em um servidor central e compartilhados com o NFS. Quanto à redução do número total de arquivos, você precisará de mais arquivos do que isso para notar, mas nas configurações de vários usuários, o número de inodes pode realmente se tornar limitante.tune2fs -l
na partição que contém meu $ HOME diz que tenho 19.300.352 inodes. Não poderei criar mais arquivos que isso. Como você disse, 10 ^ 6 não é louco, nem mesmo nas faixas mais altas. Dependendo do que você está fazendo, você pode precisar muito mais do que isso.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 comocpio
ear
. (Pacotes Debian sãoar
arquivos, emboracpio
seja frequentemente usado para ramdisks iniciais.)tar
É ou foi frequentemente combinado com ferramentas de compactação comocompress
(.Z),gzip
(.gz),bzip2
(.bz2) exz
(.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 otar
formato do arquivo. Isso significa que extrair um único arquivo de umtar
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
é essencialmentezip
o compressor sem seu arquivador exz
é essencialmente7-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
eLZ4
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.
fonte
lzo, gz, b2, lzma (.lzma2 =.xz)
são compressores de "fluxo": compactam um fluxo de bytes e não sabem e não se importam com arquivos, diretórios e metadados como permissões. Você precisa usar um arquivador como o tar para agrupar todos esses dados em um fluxo de bytes (um arquivo tar) e compactá-los com um compressor. Se você se interessa pelos dados de um único arquivo, também pode alimentar esse arquivo sozinho para um desses compressores.Tar, cpio and pax
são arquivadores: eles pegam vários arquivos e diretórios e codificam os dados e metadados em um único arquivo. O alcatrão é o mais popular e o mais compatível, embora os méritos técnicos entre os três sejam mínimos o suficiente para que houvesse guerras religiosas sobre ele durante o início dos tempos.7z e zip são compressores E arcihvers: Armazene todos os dados e metadados e os comprima. No entanto, AFAICT, nenhum deles salva permissões unix.
O Zip usa o mesmo algoritmo que o gzip chamado DEFLATE. 7z usa o algoritmo lzma
Para ler um único arquivo de um arquivo tar.gz ou similar, você precisará descomprimir todo o fluxo gz até que o arquivo tar seja exposto o suficiente para que você possa extraí-lo. O Zip permite compactar e retirar cada arquivo individualmente. 7z pode ter um ou outro comportamento.
Taxas e velocidades de compressão: gzip e lzo têm velocidades de compressão e descompressão muito muito rápidas, mas baixas taxas de compressão. Também não é preciso muita memória para compactar. O gzip é um pouco mais lento e oferece uma taxa de compactação um pouco melhor que o lzo.
É tão rápido que pode ser mais rápido ler um arquivo compactado gz ou lzo do disco e descompactá-lo rapidamente, em vez de ler o arquivo descompactado diretamente do disco.
O LZMA (xz) oferece excelente compactação em dados gerais, mas leva muito tempo para compactar e descompactar, além de levar uma quantidade significativa de memória para compactar.
O bz2 costumava ser o algoritmo de alta compactação preferido, mas desvalorizou, pois é mais lento que o lzma e leva mais tempo para compactar e descomprimir. No entanto, para certos tipos de dados (seqüências de DNA, arquivos com execuções muito grandes do mesmo byte, etc), o bzip2 pode superar todo o resto. Como exemplo, uma vez eu tive que compactar um arquivo de 1GB de 4GB e o b2 reduziu i para alguns 10s de kb, enquanto o lzma ocupou 10s de MBs, se bem me lembro.
fonte
Para arquivos especialmente grandes, você pode usar
rzip
. Primeiro, ele analisa dados redundantes em blocos grandes de 900 MB, os codifica e os transfere para o bzip2 (na verdade não, mas os mesmos algoritmos são usados).Efeito? Muito mais rápido que
xz
,lzma
oubzip2
, e, na minha experiência, sua taxa de compressão rivaliza com a delzma
. É um porco RAM, no entanto.http://en.wikipedia.org/wiki/Rzip
fonte