Come decomprimere un ZIP multipart (con spanning) su Linux?


74

Devo caricare un file da 400 MB sul mio server Web, ma sono limitato a upload da 200 MB. Il mio host mi ha suggerito di utilizzare un archivio con spanning, cosa che non ho mai fatto su Linux.

Ho creato un test nella propria cartella, zippare un file PDF in test.zip.001, .002e .003. Come posso fare per decomprimerlo? Devo unirmi prima a loro?

Si prega di notare che sarei felice di usare 7z come sto usando i formati ZIP. Se questo fa la differenza per il risultato.


Questo potrebbe non essere utile su un server Web con un software limitato installato, ma non ho visto questa soluzione da nessun'altra parte ed è quello che uso: l'API java.util.zip ha gestito tutte le parti ZIP che ho lanciato , anche nel caso più generale di non avere parti finali o l'ultima parte incompleta. Lo chiamo da Jython, quindi ha la forma di uno script, ed ecco il codice: github.com/combatopera/unzipparts
Andrzej Cichocki,

Risposte:


75

Dovrai prima unirti a loro. È possibile utilizzare l'app Linux comune, catcome nell'esempio seguente:

cat test.zip* > ~/test.zip

Ciò concatenare tutti i tuoi test.zip.001, test.zip.002file, ecc in una più grande, lima test.zip. Una volta che hai quel singolo file, puoi eseguireunzip test.zip

"Come creare, dividere, unire ed estrarre archivi zip in Linux" può essere d'aiuto.


1
OK, mi piace quello ... Progresso ... Ma sono davvero un Linux n00b qui. Presumo x*sia il nome del file? Ed ~/hugefileè una directory? Qual è lo scopo del simbolo tilde? Mi dispiace fare domande di cui sospetto siano domande basilari.
Tim

quando dividi i file, dovresti usare un prefisso come x_ (es: x_split1, x_split2, ...; come i suffissi di Windows file.001, file.002 ... ecc.) la tilde rappresenta la tua directory home. ~ / hugefile è lo stesso di / home / tim / hugefile. hai diviso i tuoi file? quali sono i nomi dei file divisi?
fromababoo,

1
Mi sembra di vedere dove la questione arriverà, l'archivio spanning creato in Windows, utilizzando 7zip con estensione ZIP, quindi crea automaticamente come TEST.zip.001, TEST.zip.002e TEST.zip.003che significa che la scissione è molto diversa. Sta iniziando a sembrare che potrebbe essere più semplice lanciare Linux su un VMWare e creare i file qui, quindi almeno mi occupo solo di 1 SO. Puoi usare il comando SPLIT su QUALSIASI tipo di file? cioè immagini, film audio ecc?
Tim

sì, il comando split funziona su qualsiasi file. installa p7zip con apt-get installa p7zip su debian o yum installa p7zip su fedora, unisce i file con: cat TEST.zip. *> archivia ed estraili con.
Fromababoo,

1
7za x archiveè probabilmente migliore se l'archivio contiene una struttura di directory.
slm

38

L' unziputility Linux in realtà non supporta zip multipart. Dal manuale :

Gli archivi multiparte non sono ancora supportati, tranne in combinazione con zip. (Tutte le parti devono essere concatenate insieme in ordine, quindi zip -F (per zip 2.x) o zip -FF(per zip 3.x) devono essere eseguite sull'archivio concatenato per "ripararlo". Inoltre, zip 3.0 e successive possono combinare archivi multiparte (divisi) in un archivio a file singolo combinato usando zip -s- inarchive -O outarchive. Vedere la pagina di manuale di zip 3 per maggiori informazioni.)

Quindi devi prima concatenare i pezzi, quindi riparare il risultato. cat test.zip.*concatena tutti i file chiamati test.zip.*dove il carattere jolly *rappresenta qualsiasi sequenza di caratteri; i file sono elencati in ordine lessicografico, che è lo stesso dell'ordine numerico grazie agli zero delle derivazioni. >test.zipdirige l'output nel file test.zip.

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

Se hai creato i pezzi suddividendo direttamente il file zip, anziché creare un zip in più parti con l'utilità Pkzip ufficiale, tutto ciò che devi fare è unire le parti.

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

1
il secondo comando dovrebbe essere zip -FF test.zip --out test-full.zip - ti darà un errore senza il comando --out
Alvin

3
Per me, l' FFapproccio ha funzionato se ho indicato zipil primo file multiparte, non catnecessario.
Jānis Elmeris,

1
Come già menzionato @ JānisElmeris, non è necessario concatenare gli archivi prima di utilizzarli zip -FF.
René,

24
7z x archive.zip.001

Troverà automaticamente il resto


1
È così strano ... Perché questo funzioni, devi prima rinominare tutti i file ZIP (.zXX e .zip) in .zip.xxx (.zip è l'ultima parte), quindi puoi usare 7z x sul primo , che "estrae" in una zip concatenata che può essere nuovamente decompressa usando unzip ma non 7z ... Non sono del tutto sicuro se il file sia stato decompresso correttamente ma almeno questa volta decomprimere non è conforme agli errori CRC. ZIP è così incredibilmente rotto su Linux - evita se puoi. :(
Energiequant,

almeno per centos, abbiamo anche bisogno di istruzioni su come installare 7z
stiv il

20

Ho trovato la risposta qui: https://superuser.com/a/517758/10264

Questa risposta è simile nel concetto a quella di Gilles , vale a dire prima si combina l'archivio diviso in un normale archivio usando diviso, quindi lo si scompatta usando decomprimere.

La differenza è che invece di usare il -FFflag, che non ha funzionato per me, dici a zip di reimballare il file diviso senza dividerlo. Questo è ciò -s 0che significa la bandiera.

Quindi, prima di tutto, combina l'archivio diviso in un unico archivio:

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

Quindi, estrarre il singolo archivio usando unzip:

unzip unsplit-foo.zip

2
Questa è la risposta corretta per zip 3.x
texasbruce,

0

Solo un altro esempio. Questo ha funzionato per me in bash per dividere il programma di installazione di Oracle 3GB:

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

Sembra molto simile alle risposte precedenti. Puoi spiegare cosa sta facendo e in che modo differisce da ciò che è già stato pubblicato? Si prega di non rispondere nei commenti; modifica la tua risposta per renderla più chiara e completa.
Scott,

Ciao Scot, vorrei poter rispondere nei commenti, ma devo fare pochi punti per farlo adesso. Questa risposta fornisce un elenco completo di comandi per dividere, unire e decomprimere un file di grandi dimensioni su unix. Fornirò un testo più esplicativo per chiarire la mia risposta. Grazie per la risposta.
AiaCoder

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.