Os arquivos ZIP criados com a GUI têm mais bytes que os arquivos ZIP criados em um shell

15

Criei dois arquivos ZIP do mesmo diretório. Um com a GUI, o outro com:

$ zip -r alpha_cmd.zip Alpha

O diretório Alpha tem 33.640 MB e 164 itens.

O arquivo ZIP criado pela GUI é 2.100 bytes maior que o arquivo ZIP criado na linha de comando.

Por que o arquivo ZIP criado com a GUI é maior?

Nota : Embora os arquivos ZIP tenham tamanhos diferentes, quando descompactados, o diretório de cada um tem exatamente o mesmo número de bytes. Basicamente, sou muito cauteloso com as possíveis inconsistências introduzidas gerenciando meu sistema de arquivos com a GUI e com os comandos do shell.

david
fonte
Um pode ter arquivos invisíveis, o outro não?
Tetsujin
Nesta resposta SU, tente:ditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
user151019 07/07
@ Mark esqueci de responder. Esse comando "idem" cria exatamente o mesmo arquivo que o Finder. E os arquivos ditto / zip / "Finder ZIP" são todos multiplataforma. Obrigado pelo seu tempo e esforço.
david

Respostas:

20

Fechar o Finder adiciona uma pasta __MACOSX, invisível em Macs, que contém garfos de recursos do OS X, como ícones personalizados e outros. Da Wikipedia :

A bifurcação de recursos é uma bifurcação ou seção de um arquivo no sistema operacional Apple Mac OS usado para armazenar dados estruturados juntamente com os dados não estruturados armazenados na bifurcação de dados. Uma bifurcação de recursos armazena informações em um formulário específico, contendo detalhes como bitmaps de ícones, formas de janelas, definições de menus e seu conteúdo e código do aplicativo (código de máquina). Por exemplo, um arquivo de processamento de texto pode armazenar seu texto na bifurcação de dados, enquanto armazena qualquer imagem incorporada na bifurcação de recursos do mesmo arquivo. A bifurcação de recursos é usada principalmente por executáveis, mas todos os arquivos podem ter uma bifurcação de recursos.

empédocle
fonte
6
Correção menor: não são apenas garfos de recursos, são todos os tipos de metadados de arquivo que o formato zip não suporta nativamente, codificados no formato AppleDouble . Isso incluirá comentários em destaque, tags, sinalizadores do Finder, dados de quarentena etc., além de bifurcações de recursos.
Gordon Davisson
E eu queria saber o que era a pasta "__MACOSX" na maioria dos zips ... Quanto mais você sabe, não é?
Ave
Outra referência que pode iluminar a resposta: stackoverflow.com/questions/107903/…
DA Vincent
4

Mesmo além da causa principal nesse caso (o Finder adiciona itens ocultos extras, como diz o empédocle), tamanhos diferentes para ZIPs dos mesmos dados não indicam um problema, quando a diferença de tamanho é uma fração de um por cento.

Implementações ZIP diferentes podem ter um nível de compactação padrão diferente (troca entre tempo e tamanho da CPU economizados) ou apenas códigos diferentes que salvam mais ou menos correspondências, economizando mais ou menos bytes no nível de compactação padrão.

Por exemplo, o 7-Zip geralmente cria .ziparquivos menores que outros programas ZIP. (E não, não estou falando de seu próprio .7zformato de arquivo. Ele também possui um compressor ZIP simples melhor.)

zipcmp é um programa cmdline que pode comparar arquivos ZIP. O padrão é comparar apenas o diretório ZIP, para verificar se todos os arquivos têm o mesmo nome, tamanho e CRC . Se for esse o caso, é quase certo que os dois arquivos ZIP tenham o mesmo conteúdo, mas apenas compactados de maneira diferente (se o tamanho compactado for diferente.) Desde que os arquivos ZIP não estejam danificados, é claro. Use unzip -t foo.zippara testar um arquivo ZIP quanto a erros de descompressão, CRCs não correspondentes etc.

Peter Cordes
fonte
As pastas __MACOSX não afetariam o cálculo da CRC?
Kent
1
O ZIP armazena em um CRC separado o conteúdo não compactado de cada arquivo compactado. (Portanto, não, por dois motivos: os diretórios contêm apenas outros arquivos, não um bloco de dados próprio. E dois, os CRCs armazenados nos metadados ZIP são para cada arquivo separadamente.) Portanto, todos os arquivos que eram iguais entre dois arquivos ZIP corresponderiam no CRC e no tamanho descompactado.
Peter Cordes
@PeterCordes O fato de que diferentes implementações ZIP podem produzir diferentes tamanhos de arquivo foi exatamente o que me chamou a atenção. Eu sabia que o shell executava "/ usr / bin / zip". Mas como o Finder me deu um tamanho de arquivo diferente, achei que o Finder usava um executável completamente diferente (e isso me perturbava). Se eu soubesse como fazer root e tivesse alguma coragem, como teste, moveria "/ usr / bin / zip" para "/ tmp" e, em seguida, tentaria um zip do Finder (e é melhor emitir um erro). Mas, tenho trabalho a fazer e não posso arriscar desestabilizar meu Mac!
David
A maneira mais segura de substituir temporariamente /usr/bin/zippor uma versão diferente seria ln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zip. Dessa forma, você sempre tem um /usr/bin/zip, porque substitui atomicamente a implementação do sistema. Além disso, a versão antiga é renomeada, não movida para /tmp(que pode estar em um sistema de arquivos diferente). Para desabilitá-la, basta renomeá-la para zip.disabver se o Finder falha e renomeá-la novamente. Mas as funções da biblioteca de criação de zip são comuns. Finder quase certamente não bifurca / exec /usr/bin/zip.
Peter Cordes
@ PeterCordes Eu entendo sobre como chamar bibliotecas em vez do executável. Mas, o executável teria sido "/ usr / bin / idem", e não "/ usr / bin / zip" de qualquer maneira. A assistência deste fórum é ótima. Obrigado pelo seu tempo e esforço.
david