Les fichiers ZIP créés avec l'interface graphique ont plus d'octets que les fichiers ZIP créés dans un shell

15

J'ai créé deux fichiers ZIP du même répertoire. L'un avec l'interface graphique, l'autre avec:

$ zip -r alpha_cmd.zip Alpha

Le répertoire Alpha fait 33,640 Mo avec 164 éléments.

Le fichier ZIP créé par l'interface graphique est plus grand de 2 100 octets que le fichier ZIP créé sur la ligne de commande.

Pourquoi le fichier ZIP est-il créé avec l'interface graphique plus grande?

Remarque : Même si les fichiers ZIP ont des tailles différentes, lorsqu'ils sont décompressés, le répertoire de chacun a exactement le même nombre d'octets. Fondamentalement, je suis très méfiant des éventuelles incohérences introduites par la gestion de mon système de fichiers avec l'interface graphique et avec les commandes shell.

David
la source
L'un peut avoir des fichiers invisibles, l'autre non?
Tetsujin
À partir de cette réponse SU, essayezditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
user151019
@Mark J'ai oublié de répondre. Cette commande "idem" crée exactement le même fichier que le Finder. Et les fichiers idem / zip / "Finder ZIP" sont tous multi-plateformes. Merci pour votre temps et vos efforts.
david

Réponses:

20

La fermeture éclair à partir du Finder ajoute un dossier __MACOSX, invisible sur Mac, qui contient des fourchettes de ressources OS X comme des icônes personnalisées et autres. De Wikipédia :

La fourchette de ressources est une fourchette ou une section d'un fichier sur le système d'exploitation Apple Mac OS utilisée pour stocker des données structurées avec les données non structurées stockées dans la fourchette de données. Une fourchette de ressources stocke les informations sous une forme spécifique, contenant des détails tels que les bitmaps d'icônes, les formes des fenêtres, les définitions des menus et leur contenu et le code d'application (code machine). Par exemple, un fichier de traitement de texte peut stocker son texte dans la fourchette de données, tout en stockant toutes les images incorporées dans la fourchette de ressources du même fichier. La fourchette de ressources est principalement utilisée par les exécutables, mais chaque fichier peut avoir une fourchette de ressources.

empédocle
la source
6
Correction mineure: ce ne sont pas seulement des fourchettes de ressources, ce sont toutes sortes de métadonnées de fichier que le format zip ne gère pas nativement, encodées au format AppleDouble . Cela comprendra des commentaires, des balises, des indicateurs du Finder, des données de quarantaine, etc., ainsi que des fourchettes de ressources.
Gordon Davisson
Et je me demandais quel était le dossier "__MACOSX" dans la plupart des zips ... Plus vous en savez, hein?
Ave
Une autre référence qui pourrait éclairer la réponse: stackoverflow.com/questions/107903/…
DA Vincent
4

Même en dehors de la cause principale dans ce cas (le Finder ajoutant des éléments cachés supplémentaires, comme le dit l'empedocle), différentes tailles pour les ZIP des mêmes données n'indiquent pas de problème, lorsque la différence de taille est d'une fraction d'un pour cent.

Différentes implémentations ZIP peuvent avoir un niveau de compression par défaut différent (compromis entre le temps CPU et la taille enregistrée), ou simplement avoir un code différent qui enregistre plus ou moins de correspondances, économisant plus ou moins d'octets au niveau de compression par défaut.

Par exemple, 7-Zip crée généralement des .zipfichiers plus petits que les autres programmes ZIP. (Et non, je ne parle pas de son propre.7z format de fichier. Il a aussi un meilleur compresseur plain-ZIP.)

zipcmp est un programme cmdline qui peut comparer des fichiers ZIP. Par défaut, il compare uniquement le répertoire ZIP, pour vérifier que tous les fichiers ont le même nom, la même taille et le même CRC . Si tel est le cas, les deux fichiers ZIP sont presque certains d'avoir le même contenu, mais simplement compressés différemment (si la taille compressée diffère.) Tant que les fichiers ZIP ne sont pas endommagés, bien sûr. Utilisez unzip -t foo.zippour tester un fichier ZIP pour les erreurs de décompression, les CRC non correspondants, etc.

Peter Cordes
la source
Les dossiers __MACOSX n'affecteraient-ils pas le calcul CRC?
Kent
1
ZIP stocke un CRC distinct le contenu non compressé de chaque fichier compressé. (Donc non, pour deux raisons: les répertoires ne contiennent que d'autres fichiers, pas un bloc de données qui leur est propre. Et deux, les CRC stockés dans les métadonnées ZIP sont pour chaque fichier séparément.) Donc, tous les fichiers qui étaient les mêmes entre deux fichiers ZIP correspondraient en CRC et en taille décompressée.
Peter Cordes
@PeterCordes Le fait que différentes implémentations ZIP peuvent produire des tailles de fichier différentes est exactement ce qui a retenu mon attention. Je savais que le shell exécutait "/ usr / bin / zip". Mais depuis que Finder m'a donné une taille de fichier différente, je pensais que Finder utilisait un exécutable complètement différent (et cela me dérangeait). Si je savais comment rooter et que j'avais un peu de courage, comme test, je déplacerais "/ usr / bin / zip" vers "/ tmp", puis j'essaierais un zip du Finder (et il vaut mieux émettre une erreur). Mais j'ai du travail à faire et je ne peux pas risquer de déstabiliser mon Mac!
david
Le moyen le plus sûr de le remplacer temporairement /usr/bin/zippar une autre version serait ln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zip. De cette façon, vous en avez toujours un /usr/bin/zip, car vous remplacez atomiquement l'implémentation du système. De plus, l'ancienne version est juste renommée, pas déplacée vers /tmp(qui pourrait éventuellement être sur un système de fichiers différent.) Pour la désactiver, je la renommerais juste zip.disab, voir si le Finder se casse, puis je la renomme. Mais les fonctions de bibliothèque de création de zip sont courantes. Le Finder ne fait certainement pas de fork / exec /usr/bin/zip.
Peter Cordes
@PeterCordes Je comprends à propos d'appeler des bibliothèques au lieu de l'exécutable. Mais, l'exécutable aurait été "/ usr / bin / ditto", et non "/ usr / bin / zip" de toute façon. L'assistance de ce forum est formidable. Merci pour votre temps et vos efforts.
david