ZIP-файлы, созданные с помощью графического интерфейса, имеют больше байтов, чем ZIP-файлы, созданные в оболочке

15

Я создал два ZIP- файла одного каталога. Один с графическим интерфейсом, другой с:

$ zip -r alpha_cmd.zip Alpha

Альфа каталог 33.640 MB с 164 пунктов.

ZIP-файл, созданный с помощью графического интерфейса пользователя, на 2100 байт больше, чем ZIP-файл, созданный в командной строке.

Почему ZIP-файл создан с большим графическим интерфейсом?

Примечание . Несмотря на то, что файлы ZIP имеют разный размер, в разархивированном виде каждый каталог имеет одинаковое количество байтов. По сути, я очень осторожен в отношении возможных несоответствий, возникающих при управлении моей файловой системой с помощью графического интерфейса и команд оболочки.

Дэвид
источник
Один может иметь невидимые файлы, другой нет?
Тетсуджин
Из этого ответа SU попробуйтеditto -ck --rsrc --sequesterRsrc --keepParent folder folder.zip
user151019
@ Марк, я забыл ответить. Эта команда "ditto" создает тот же файл, что и Finder. И файлы ditto / zip / "Finder ZIP" все кроссплатформенные. Спасибо за ваше время и усилия.
Дэвид

Ответы:

20

При архивации из Finder добавляется папка __MACOSX, невидимая на компьютерах Mac, которая содержит вилки ресурсов OS X, такие как пользовательские значки и тому подобное. Из Википедии :

Разветвление ресурса - это разветвление или раздел файла в операционной системе Apple Mac OS, используемый для хранения структурированных данных вместе с неструктурированными данными, хранящимися в разветвлении данных. В ветке ресурсов хранится информация в определенной форме, содержащая такие сведения, как растровые изображения значков, формы окон, определения меню и их содержимого, а также код приложения (машинный код). Например, файл обработки текста может хранить свой текст в ветке данных, в то время как любые встроенные изображения хранятся в ветке ресурсов того же файла. Форк ресурса используется в основном исполняемыми файлами, но каждый файл может иметь форк ресурса.

Эмпедокле
источник
6
Незначительное исправление: это не просто разветвление ресурсов, это всевозможные метаданные файлов, которые формат zip не обрабатывает изначально, закодированные в формате AppleDouble . Сюда входят комментарии, теги, флаги Finder, данные о карантине и т. Д., А также ветки ресурсов.
Гордон Дэвиссон
И мне было интересно, что это за папка "__MACOSX" в большинстве почтовых индексов ... Чем больше вы знаете, а?
Аве
Еще одна ссылка, которая может пролить свет на ответ: stackoverflow.com/questions/107903/…
DA Vincent
4

Даже если не учитывать основную причину в этом случае (Finder добавляет дополнительные скрытые элементы, как говорит empedocle), разные размеры для ZIP с одинаковыми данными не указывают на проблему, когда разница в размере составляет доли процента.

Разные реализации ZIP могут иметь разный уровень сжатия по умолчанию (компромисс между временем и размером процессора) или просто иметь другой код, который сохраняет больше или меньше совпадений, сохраняя больше или меньше байтов при уровне сжатия по умолчанию.

Например, 7-Zip обычно создает .zipфайлы меньшего размера, чем другие программы ZIP. (И нет, я не говорю о собственном .7zформате файла. У него также есть лучший компрессор с простым ZIP-архивом.)

zipcmp - это программа cmdline, которая может сравнивать файлы ZIP. По умолчанию сравнивается только папка ZIP, чтобы убедиться, что все файлы имеют одинаковое имя, размер и CRC . Если это так, то оба ZIP-файла почти наверняка имеют одинаковое содержимое, но просто сжимаются по-разному (если размер сжатого файла различен). Конечно, если ZIP-файлы не повреждены. Используется unzip -t foo.zipдля проверки файла ZIP на наличие ошибок распаковки, несовпадающих CRC и т. Д.

Питер Кордес
источник
Не повлияют ли папки __MACOSX на расчет CRC?
Кент
1
ZIP хранит отдельный CRC несжатый контент каждого сжатого файла. (Так что нет, по двум причинам: каталоги содержат только другие файлы, а не отдельный блок данных. И два, CRC, хранящиеся в метаданных ZIP, предназначены для каждого файла отдельно.) Таким образом, все файлы, которые были одинаковыми между два файла ZIP будут соответствовать CRC и разархивированному размеру.
Питер Кордес
@PeterCordes Тот факт, что разные реализации ZIP могут создавать файлы разного размера, как раз и привлек мое внимание. Я знал, что оболочка выполняет "/ usr / bin / zip". Но так как Finder дал мне другой размер файла, я подумал, что Finder использовал совершенно другой исполняемый файл (и это меня расстроило). Если бы я знал, как выполнить su root, и имел немного смелости, в качестве теста я бы переместил "/ usr / bin / zip" в "/ tmp", а затем попробовал бы использовать Finder zip (и лучше выдать ошибку). Но у меня есть работа, и я не могу рисковать дестабилизацией моего Mac!
Дэвид
Самый безопасный способ временно заменить /usr/bin/zipна другую версию будет ln /usr/bin/zip /usr/bin/zip.standard; mv new_zip /usr/bin/zip. Таким образом, у вас всегда есть /usr/bin/zip, потому что вы атомарно замените реализацию системы. Кроме того, старая версия просто переименовывается, а не перемещается /tmp(что может быть в другой файловой системе). Чтобы отключить ее, я просто переименую ее zip.disab, посмотрю, не сломается ли Finder, а затем переименует ее обратно. Но функции библиотеки создания zip распространены. Искатель почти наверняка не форк / exec /usr/bin/zip.
Питер Кордес
@PeterCordes Я получаю информацию о вызове библиотек вместо исполняемого файла. Но исполняемый файл был бы "/ usr / bin / ditto", а не "/ usr / bin / zip" в любом случае. Помощь с этого форума велика. Спасибо за ваше время и усилия.
Дэвид