Pliki ZIP utworzone za pomocą GUI mają więcej bajtów niż pliki ZIP utworzone w powłoce

15

Utworzyłem dwa pliki ZIP tego samego katalogu. Jeden z GUI, drugi z:

$ zip -r alpha_cmd.zip Alpha

Katalog Alpha ma 33,640 MB i zawiera 164 elementy.

Plik ZIP utworzony przez GUI jest o 2100 bajtów większy niż plik ZIP utworzony w wierszu poleceń.

Dlaczego plik ZIP jest tworzony za pomocą GUI?

Uwaga : Mimo że pliki ZIP mają różne rozmiary, po rozpakowaniu katalog każdego z nich ma dokładnie taką samą liczbę bajtów. Zasadniczo jestem bardzo ostrożny wobec możliwych niespójności wprowadzanych przez zarządzanie moim systemem plików za pomocą GUI i poleceń powłoki.

David
źródło
Jeden może mieć niewidoczne pliki, drugi nie?
Tetsujin
Z tej odpowiedzi SU spróbujditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
użytkownik151019,
@ Mark Nie pamiętam odpowiedzi. To polecenie „ditto” tworzy dokładnie ten sam plik co Finder. Pliki ditto / zip / „Finder ZIP” są dostępne na różnych platformach. Dziękujemy za poświęcony czas i wysiłek.
David

Odpowiedzi:

20

Zipowanie z Findera dodaje folder __MACOSX, niewidoczny na komputerach Mac, zawierający widelce zasobów OS X, takie jak ikony niestandardowe i tym podobne. Z Wikipedii :

Widelec zasobów jest rozwidleniem lub sekcją pliku w systemie operacyjnym Apple Mac OS służącym do przechowywania danych strukturalnych wraz z danymi nieustrukturyzowanymi przechowywanymi w widelcu danych. Widelec zasobu przechowuje informacje w określonej formie, zawierające takie szczegóły, jak mapy bitowe ikon, kształty okien, definicje menu i ich zawartości oraz kod aplikacji (kod maszynowy). Na przykład plik edytora tekstu może przechowywać tekst w widelcu danych, a jednocześnie przechowywać wszelkie osadzone obrazy w widelcu zasobów tego samego pliku. Widelec zasobów jest używany głównie przez pliki wykonywalne, ale każdy plik może mieć widelec zasobów.

empedokl
źródło
6
Drobna korekta: to nie tylko rozwidlenia zasobów, to wszelkiego rodzaju metadane plików, których format zip nie obsługuje natywnie, zakodowany w formacie AppleDouble . Obejmuje to komentarze, tagi, flagi Findera, dane kwarantanny itp., A także widelce zasobów.
Gordon Davisson,
Zastanawiałem się, co to jest folder „__MACOSX” w większości zamków błyskawicznych ... Im więcej wiesz, co?
Ave
Kolejne odniesienie, które może podświetlić odpowiedź: stackoverflow.com/questions/107903/…
DA Vincent
4

Nawet oprócz głównej przyczyny w tym przypadku (Finder dodaje dodatkowe ukryte rzeczy, jak mówi empedocle), różne rozmiary ZIP-ów tych samych danych nie wskazują na problem, gdy różnica wielkości wynosi ułamek procenta.

Różne implementacje ZIP mogą mieć inny domyślny poziom kompresji (zapisany czas pracy procesora i rozmiar) lub po prostu mieć inny kod, który zapisuje więcej lub mniej dopasowań, oszczędzając więcej lub mniej bajtów na domyślnym poziomie kompresji.

Na przykład 7-Zip zwykle tworzy mniejsze .zippliki niż inne programy ZIP. (I nie, nie mówię o własnym .7zformacie pliku. Ma też lepszy kompresor ZIP).

zipcmp to program cmdline, który może porównywać pliki ZIP. Domyślnie porównuje tylko katalog ZIP, aby sprawdzić, czy wszystkie pliki mają tę samą nazwę, rozmiar i CRC . W takim przypadku oba pliki ZIP prawie na pewno mają tę samą zawartość, ale po prostu skompresowane inaczej (jeśli rozmiar skompresowanego różni się.) Oczywiście, dopóki pliki ZIP nie zostaną uszkodzone. Służy unzip -t foo.zipdo testowania pliku ZIP pod kątem błędów dekompresyjnych, niezgodnych CRC itp.

Peter Cordes
źródło
Czy foldery __MACOSX nie wpłyną na obliczenia CRC?
Kent
1
ZIP przechowuje osobne CRC nieskompresowaną zawartość każdego skompresowanego pliku. (Więc nie, z dwóch powodów: katalogi zawierają tylko inne pliki, a nie własny blok danych. Po drugie, CRC przechowywane w metadanych ZIP są dla każdego pliku osobno.) Więc wszystkie pliki, które były takie same między dwa pliki ZIP byłyby zgodne w CRC i zdekompresowane.
Peter Cordes,
@PeterCordes Fakt, że różne implementacje ZIP mogą generować różne rozmiary plików, właśnie przykuło moją uwagę. Wiedziałem, że powłoka wykonała polecenie „/ usr / bin / zip”. Ale odkąd Finder dał mi inny rozmiar pliku, pomyślałem, że Finder użył zupełnie innego pliku wykonywalnego (i to mnie denerwowało). Gdybym wiedział, jak su rootować i mieć trochę odwagi, jako test przeniósłbym „/ usr / bin / zip” do „/ tmp”, a następnie wypróbowałem Zip Findera (i lepiej wydać błąd). Ale pracuję nad tym i nie mogę ryzykować destabilizacji mojego Maca!
David
Najbezpieczniejszym sposobem tymczasowego zastąpienia /usr/bin/zipgo inną wersją jest ln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zip. W ten sposób zawsze masz /usr/bin/zip, ponieważ atomowo zastępujesz implementację systemu. Ponadto stara wersja została po prostu przemianowana, a nie przeniesiona do /tmp(który może być na innym systemie plików). Aby ją wyłączyć, po prostu zmień jej nazwę zip.disab, zobacz, czy Finder się zepsuje, a następnie zmień nazwę z powrotem. Ale funkcje biblioteki do tworzenia zip są powszechne. Finder prawie na pewno nie rozwidla / exec /usr/bin/zip.
Peter Cordes,
@PeterCordes Rozumiem, jak wywoływać biblioteki zamiast plików wykonywalnych. Ale plikiem wykonywalnym byłby „/ usr / bin / ditto”, a nie „/ usr / bin / zip”. Pomoc z tego forum jest świetna. Dziękujemy za poświęcony czas i wysiłek.
David