Это почти наверняка не сработает(обновление:см. также этот ответ)
Zip-архив (, но с другими архивами мало что меняется )построен как файловая система:
Предположим, мы должны обновить файл #1 без перемещения файла #2, а файл #1 потенциально больше после сжатия. Это потребует:
создание «мертвой зоны» в начале Zip-файла. Было бы возможно использовать эту область для дальнейшего хранения другого файла. По сути, вам нужно заархивировать входящий файл во временный файл, получив таким образом его окончательный размер; вооружившись этим, вы сканируете zip-файл и ищете «дыры». Если существует подходящая «дыра», скопируйте временный файл внутрь zip-файла, возможно, оставив меньшую «дыру»; в противном случае добавьте его, заменив центральный заголовок.
Хотя возможно , управление свободным пространством внутри Zip-архива, а также объединение смежных «дыр» требуют осторожности, и, насколько мне известно, никто никогда этого не делал (. Я мог бы, например, написать независимая от сжатия -утилита для замены файла внутри Zip-файла, использующая основную утилиту zip для создания нового сжатого потока и заменяющая старое имя файла узнаваемой последовательностью, чтобы пометить его как свободное пространство; это было бы ужасно медленно ).
Самое близкое к тому, что вы хотите, это использовать совершенно другой формат -, который вы бы создали, скажем, btrfs
файловой системой на кольцевом устройстве,установив его на максимальное доступное сжатие (, я полагаю, что это будет LZO ). Затем вы монтируете петлевое устройство и используете rsync
для его обновления. Размонтируйте петлевое устройство, и хост-файл будет сжатым архивом... своего рода. В зависимости от характера файла вы даже можете использовать возможности дедупликации btrfs
.
Коэффициент сжатия сжатых файловых систем ниже, чем Zip, но несколько файлов (PDF, ZIP, очевидно, большинство форматов изображений, таких как JPEG, PNG и GIF, современные (Libre )Офисные форматы...)нельзя сжимать , так что это не проблема. Поскольку вы говорите, что несжатые файлы имеют размер 36 ГБ, а Zip — 32 ГБ, вы, вероятно, находитесь в этой ситуации и, вероятно, выиграете от несжатого -формата ).