Как разархивировать многочастный (составной) ZIP на Linux?

74

Мне нужно загрузить файл 400 МБ на мой веб-сервер, но я ограничен загрузкой 200 МБ. Мой хост предложил мне использовать составной архив, чего я никогда не делал в Linux.

Я создал тест в своей папке, сжать вверх PDF в test.zip.001, .002и .003. Как мне разархивировать его? Нужно ли сначала присоединиться к ним?

Обратите внимание, что я буду так же рад использовать 7z, как и форматы ZIP. Если это имеет какое-либо значение для результата.

Тим
источник
Это может быть бесполезно на веб-сервере с установленным ограниченным программным обеспечением, но я нигде не видел этого решения, и именно это я использую: API java.util.zip работал со всеми ZIP-частями, которые я выбрасывал. даже в более общем случае отсутствия задних частей или неполной последней части. Я звоню из Jython, так что это в форме скрипта, и вот код: github.com/combatopera/unzipparts
Анджей Чихоцки

Ответы:

75

Сначала вам нужно присоединиться к ним. Вы можете использовать обычное приложение linux, catкак в примере ниже:

cat test.zip* > ~/test.zip

Это сцепить все ваши test.zip.001, test.zip.002и т.д файлов в один большой, test.zip файл. Если у вас есть этот единственный файл, вы можете запуститьunzip test.zip

«Как создавать, разбивать, объединять и извлекать zip-архивы в Linux» может помочь.

fromnaboo
источник
1
Хорошо, мне это нравится ... Прогресс ... Но я действительно Linux n00b здесь. Я полагаю, x*это имя файла? И ~/hugefileэто каталог? Какова цель символа тильды? Извините, что спрашиваю, что я подозреваю, это очень простые вопросы.
Тим
когда вы разделяете файлы, вы должны использовать префикс, такой как x_ (например: x_split1, x_split2, ...; как и суффиксы Windows file.001, file.002 ... и т. д.), тильда представляет ваш домашний каталог. ~ / огромный файл - это то же самое, что и / дом / Тим / огромный файл. ты разделил свои файлы? что такое имена разделенных файлов?
fromnaboo
1
Я думаю, я вижу, где проблема возникнет, Spanned архив был создан в Windows, используя 7zip с расширением ZIP, так что он автоматически создает как TEST.zip.001, TEST.zip.002и TEST.zip.003это означает, что разделение сильно отличается. Начинает казаться, что может быть проще добавить Linux на VMWare и создавать файлы здесь, тогда, по крайней мере, я имею дело только с 1 ОС. Вы можете использовать команду SPLIT для ЛЮБОГО типа файла? то есть изображения, аудио фильмы и т. д.?
Тим
да, команда split работает с любым файлом. установить p7zip с помощью apt-get установить p7zip в Debian или yum установить p7zip в fedora, объединить файлы с помощью: cat TEST.zip. *> и распаковать их.
fromnaboo
1
7za x archiveВероятно, лучше, если архив содержит структуру каталогов.
SLM
38

unzipУтилита Linux на самом деле не поддерживает составные почтовые индексы. Из руководства :

Многокомпонентные архивы пока не поддерживаются, кроме как в сочетании с zip. (Все части должны быть соединены вместе по порядку, а затем zip -F (для zip 2.x) или zip -FF(для zip 3.x) должны быть выполнены для объединенного архива, чтобы «исправить» его. Кроме того, zip 3.0 и более поздние версии могут объединяться многочастные (разделенные) архивы в объединенный однофайловый архив с использованием zip -s- inarchive -O outarchive. Для получения дополнительной информации см. справочную страницу zip 3. )

Таким образом, вам нужно сначала соединить части, а затем восстановить результат. cat test.zip.*объединяет все файлы, вызываемые test.zip.*там, где подстановочный знак *обозначает любую последовательность символов; файлы нумеруются в лексикографическом порядке, который совпадает с числовым порядком благодаря нулям в начале. >test.zipнаправляет вывод в файл test.zip.

cat test.zip.* >test.zip
zip -FF test.zip --out test-full.zip
unzip test-full.zip

Если вы создали фрагменты, непосредственно разбив zip-файл, в отличие от создания zip-файла из нескольких частей с помощью официальной утилиты Pkzip, все, что вам нужно сделать, это соединить части.

cat test.zip.* >test.zip
unzip test.zip
Жиль "ТАК - перестань быть злым"
источник
1
вторая команда должна быть zip -FF test.zip --out test-full.zip - выдаст ошибку без команды --out
Элвин
3
Для меня FFподход сработал, если я указал zipна первый файл, catсостоящий из нескольких частей, без необходимости.
Янис Элмерис
1
Как уже упоминалось @ JānisElmeris, нет необходимости объединять архивы перед использованием zip -FFна них.
Рене
24
7z x archive.zip.001

Он автоматически найдет остальные

туман
источник
1
Это так странно ... Чтобы это работало, сначала нужно переименовать все ZIP-файлы (.zXX и .zip) в .zip.xxx (.zip - последняя часть), затем вы можете использовать 7z x в первой , который "извлекает" в сцепленный zip-файл, который затем может быть снова распакован с помощью unzip, но не 7z ... Я не совсем уверен, правильно ли был распакован файл, но по крайней мере на этот раз unzip не компланирует об ошибках CRC .. ZIP так невероятно сломан в Linux - избегайте, если можете. :(
Energiequant
по крайней мере, для Centos, нам также нужно инструкция, как установить 7z
Stiv
20

Я нашел ответ здесь: https://superuser.com/a/517758/10264

Этот ответ в принципе аналогичен ответу Жиля , а именно: сначала вы объединяете разделенный архив в обычный архив с помощью split, а затем распаковываете его с помощью unzip.

Разница в том, что вместо использования -FFфлага, который у меня не работал, вы просто указываете zip перепаковать файл split без разделения. Вот что -s 0означает флаг.

Итак, во-первых, объедините разделенный архив в один архив:

zip -s 0 split-foo.zip --out unsplit-foo.zip

Затем распакуйте один архив с помощью unzip:

unzip unsplit-foo.zip
Пол Уогланд
источник
2
Это правильный ответ для zip 3.x
texasbruce
0

Просто еще один пример. Это работает для меня в bash, чтобы разделить установщик 3GB Oracle:

echo "<installOracleDB.sh>: Splitting OracleDB installer"
zip /tmp/linuxx64_12201_database.zip --out /tmp/linuxx64_12201_oradb.zip -s 1000m
echo "<installOracleDB.sh>: Merging OracleDB installer"
zip -FF /tmp/linuxx64_12201_oradb.zip --out /tmp/linuxx64_12201_database.zip
echo "<installOracleDB.sh>: Removing temporary files OracleDB installer"
find /tmp -type f -name 'linuxx64_12201_oradb*' -exec rm {} +
echo "<installOracleDB.sh>: Unizipping OracleDB installer"
unzip /tmp/linuxx64_12201_database.zip
TheHagueCoder
источник
Это выглядит очень похоже на предыдущие ответы. Можете ли вы объяснить, что он делает, и чем он отличается от того, что уже было опубликовано? Пожалуйста, не отвечайте в комментариях; отредактируйте свой ответ, чтобы сделать его более понятным и полным.
Скотт
Привет Скот, я хотел бы ответить в комментариях, но у меня есть несколько моментов, чтобы сделать это прямо сейчас. Этот ответ дает полный список команд для разделения, объединения и распаковки большого файла в Unix. Я предоставлю больше поясняющего текста, чтобы уточнить мой ответ. Спасибо за ваш ответ.
TheHagueCoder
0

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

unar first_file

https://directory.fsf.org/wiki/Unar#Details

Гуариба сом
источник