Como descompactar um ZIP de várias partes (estendido) no Linux?


74

Preciso fazer upload de um arquivo de 400 MB para o meu servidor da Web, mas estou limitado a envios de 200 MB. Meu host sugeriu que eu usasse um arquivo estendido, o que nunca fiz no Linux.

Eu criei um teste em sua própria pasta, fechando um PDF em test.zip.001, .002, e .003. Como faço para descompactá-lo? Preciso me juntar a eles primeiro?

Observe que eu ficaria tão feliz usando o 7z quanto os formatos ZIP. Se isso faz alguma diferença para o resultado.


Isso pode não ser útil em um servidor Web com software limitado instalado, mas eu não vi essa solução em nenhum outro lugar e é o que eu uso: A API java.util.zip lidou com todas as partes ZIP que joguei nela , mesmo no caso mais geral de não ter partes finais ou a última parte incompleta. Eu chamá-lo de Jython por isso é na forma de um script, e aqui está o código: github.com/combatopera/unzipparts
Andrzej Cichocki

Respostas:


75

Você precisará se juntar a eles primeiro. Você pode usar o aplicativo linux comum, catcomo no exemplo abaixo:

cat test.zip* > ~/test.zip

Isto irá concatenar todos os seus test.zip.001, test.zip.002, etc arquivos em um maior, arquivo test.zip. Depois de ter esse arquivo único, você pode executarunzip test.zip

"Como criar, dividir, juntar e extrair arquivos zip no Linux" pode ajudar.


11
OK, eu gosto disso ... Progresso ... Mas eu realmente sou um n00b do Linux aqui. Presumo que x*é o nome do arquivo? E ~/hugefileé um diretório? Qual é o objetivo do símbolo til? Desculpe perguntar o que suspeito serem perguntas muito básicas.
Tim

ao dividir os arquivos, você deve usar um prefixo como x_ (ex: x_split1, x_split2, ...; como os sufixos do Windows file.001, file.002 ... etc) o til representa o diretório inicial. ~ / hugefile é o mesmo que / home / tim / hugefile. você dividiu seus arquivos? quais são os nomes dos arquivos divididos?
fromnaboo

11
Acho que vejo onde o problema entrará, o arquivo Spanned foi criado no Windows, usando o 7zip com uma extensão ZIP, para criar automaticamente como e TEST.zip.001, o que significa que a divisão é muito diferente. Está começando a parecer que pode ser mais fácil jogar linux em um VMWare e criar os arquivos aqui, pelo menos estou lidando apenas com 1 sistema operacional. Você pode usar o comando SPLIT em QUALQUER tipo de arquivo? ou seja, imagens, filmes de áudio etc? TEST.zip.002TEST.zip.003
Tim

sim, o comando split funciona em qualquer arquivo. instale o p7zip com o apt-get instale o p7zip no debian ou yum instale o p7zip no fedora, junte-se aos arquivos com: cat TEST.zip. *> arquive e extraia-os com.
fromnaboo

11
7za x archiveprovavelmente é melhor se o arquivo contém uma estrutura de diretórios.
slm

38

O unziputilitário Linux realmente não suporta zips de várias partes. Do manual :

Os arquivos com várias partes ainda não são suportados, exceto em conjunto com o zip. (Todas as partes devem ser concatenadas juntas em ordem e, em seguida, zip -F (no zip 2.x) ou zip -FF(no zip 3.x) devem ser executadas no arquivo concatenado para "consertá-lo". Além disso, o zip 3.0 e posterior podem combinar arquivos de várias partes (divididos) em um arquivo combinado de arquivo único usando zip -s- inarchive -O outarchive. Consulte a página do manual do zip 3 para obter mais informações.)

Então você precisa primeiro concatenar as peças, depois reparar o resultado. cat test.zip.*concatena todos os arquivos chamados test.zip.*onde o curinga *representa qualquer sequência de caracteres; os arquivos são enumerados em ordem lexicográfica, que é igual à ordem numérica, graças aos zeros à esquerda. >test.zipdireciona a saída para o arquivo test.zip.

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

Se você criou as peças dividindo diretamente o arquivo zip, em vez de criar um zip com várias partes com o utilitário Pkzip oficial, tudo o que você precisa fazer é juntar as peças.

cat test.zip.* >test.zip
unzip test.zip

11
o segundo comando deve ser zip -FF test.zip --out test-full.zip - lhe dará um erro sem o comando --out
Alvin

3
Para mim, a FFabordagem funcionou se eu apontasse zippara o primeiro arquivo com várias partes, não catnecessário.
Jānis Elmeris

11
Como o @ JānisElmeris já mencionou, não há necessidade de concatenar os arquivos antes de usá zip -FF-los.
René

24
7z x archive.zip.001

Ele encontrará automaticamente o resto


11
Isso é tão estranho ... Para que isso funcione, primeiro é necessário renomear todos os arquivos ZIP (.zXX e .zip) para .zip.xxx (.zip é a última parte) e, em seguida, você pode usar 7z x na primeira , que "extrai" para um zip concatenado que pode ser descompactado novamente usando descompactar, mas não 7z ... Não tenho certeza se o arquivo foi descompactado corretamente, mas pelo menos dessa vez o descompactação não é compatível com erros de CRC. O ZIP está incrivelmente quebrado no Linux - evite se puder. :(
Energiequant

pelo menos para centos, também precisamos de instruções sobre como instalar o 7z
stiv

20

Encontrei a resposta aqui: https://superuser.com/a/517758/10264

Essa resposta é semelhante em conceito à de Gilles , ou seja, primeiro você combina o arquivo dividido em um arquivo normal usando divisão e, em seguida, descompacta-o usando descompactar.

A diferença é que, em vez de usar a -FFflag, que não funcionou para mim, basta dizer ao zip para reembalar o arquivo dividido sem dividir. É isso que a -s 0bandeira significa.

Então, primeiro, combine o arquivo dividido em um único arquivo:

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

Em seguida, extraia o arquivo único usando descompactar:

unzip unsplit-foo.zip

2
Esta é a resposta correta para 3.x zip
texasbruce

0

Apenas mais um exemplo. Isso funcionou para mim no bash para dividir o instalador do oracle de 3 GB:

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

Isso parece muito com as respostas anteriores. Você pode explicar o que está fazendo e como difere do que já foi publicado? Por favor, não responda nos comentários; edite sua resposta para torná-la mais clara e completa.
Scott

Oi Scot, eu gostaria de poder responder nos comentários, mas eu tenho alguns pontos para fazer isso agora. Esta resposta fornece uma lista completa de comandos para dividir, mesclar e descompactar um arquivo grande no unix. Fornecerei mais texto explicativo para esclarecer minha resposta. Obrigado por sua resposta.
TheHagueCoder

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.