139

I need to upload a 400mb file to my web server, but I'm limited to 200mb uploads. My host suggested I use a spanned archive, which I've never done on Linux.

I created a test in its own folder, zipping up a PDF into test.zip.001, .002, and .003. How do I go about unzipping it? Do I need to join them first?

Please note that I'd be just as happy using 7z as I am using ZIP formats. If this makes any difference to the outcome.

Tim
  • 1,493
  • This may not be helpful on a web server with limited software installed, but I haven't seen this solution anywhere else and it's what I use: The java.util.zip API has dealt with all the ZIP parts I've thrown at it, even in the more general case of not having trailing parts or the last part being incomplete. I call it from Jython so it's in the form of a script, and here is the code: https://github.com/combatopera/unzipparts – Andrzej Cichocki Feb 16 '13 at 22:29

10 Answers10

164

You will need to join them first. You may use the common linux app, cat as in the example below:

cat test.zip* > ~/test.zip

This will concatenate all of your test.zip.001, test.zip.002, etc files into one larger, test.zip file. Once you have that single file, you may run unzip test.zip

"How to create, split, join and extract zip archives in Linux" may help.

ljs.dev
  • 2,137
  • 4
  • 20
  • 31
fromnaboo
  • 6,932
  • 1
    OK, I like that... Progress... But I really am a Linux n00b here. I assume x* is the filename? And ~/hugefile is a directory? What is the purpose of the tilde symbol? Sorry to ask what I suspect are very basic questions. – Tim Jun 11 '12 at 02:54
  • when you split the files, you should use a prefix like x_ (ex: x_split1 , x_split2 , ... ; like the windows suffixes file.001, file.002...etc) the tilde represents your home directory. ~/hugefile is the same as /home/tim/hugefile. did you split your files ? what are the split files names? – fromnaboo Jun 11 '12 at 02:59
  • 1
    I think I see where the issue will come in, the Spanned archive was created in windows, using 7zip with a ZIP extension, so it auto creates as TEST.zip.001, TEST.zip.002 and TEST.zip.003 which means the split is very different. It's starting to look like it may be easier to thrown linux on a VMWare and create the files here, then at least i'm only dealing with 1 OS.

    Can you use the SPLIT command on ANY file type? i.e. images, audio movies etc?

    – Tim Jun 11 '12 at 03:03
  • yes, the split command works on any file. install p7zip with apt-get install p7zip on debian or yum install p7zip on fedora, join the files with: cat TEST.zip.* > archive and extract them with. – fromnaboo Jun 11 '12 at 03:05
  • 1
    extract with $ 7za e archive – fromnaboo Jun 11 '12 at 03:11
  • Can CAT be used on files other than txt files? – Tim Jun 11 '12 at 10:04
  • yes. you can join other files than txt files with cat. – fromnaboo Jun 11 '12 at 12:22
  • 3
    7za x archive is probably better if the archive contains a directory structure. – slm Jan 25 '13 at 16:50
  • Note that this doesnt work when having more than 10 files, because they will be sorted in the wrong order: file1 file10 file2

    To preserve ordering on large number of files, use: find ./ -name "*.zip.*" | sort -V | xargs cat > full.zip

    – yogi Jan 03 '21 at 08:52
  • 7za e archive works. Thanks @fromnaboo – Shaohua Li Nov 29 '22 at 05:58
72

The Linux unzip utility doesn't really support multipart zips. From the manual:

Multi-part archives are not yet supported, except in conjunction with zip. (All parts must be concatenated together in order, and then zip -F (for zip 2.x) or zip -FF (for zip 3.x) must be performed on the concatenated archive in order to “fix” it. Also, zip 3.0 and later can combine multi-part (split) archives into a combined single-file archive using zip -s- inarchive -O outarchive. See the zip 3 manual page for more information.)

So you need to first concatenate the pieces, then repair the result. cat test.zip.* concatenates all the files called test.zip.* where the wildcard * stands for any sequence of characters; the files are enumerated in lexicographic order, which is the same as numerical order thanks to the leadings zeroes. >test.zip directs the output into the file test.zip.

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

If you created the pieces by directly splitting the zip file, as opposed to creating a multi-part zip with the official Pkzip utility, all you need to do is join the parts.

cat test.zip.* >test.zip
unzip test.zip
64
7z x archive.zip.001

It will automatically find the rest

mist
  • 1,115
  • 1
  • 11
  • 10
  • 3
    That's so weird... For this to work, you first need to rename all ZIP files (.zXX and .zip) to .zip.xxx (.zip is the last part), then you can use 7z x on the first one, which "extracts" to a concatenated zip which can then again be decompressed using unzip but not 7z... I'm not entirely sure if the file has been unpacked correctly but at least this time unzip does not complan about CRC errors... ZIP is so incredibly broken on Linux - avoid if you can. :( – Energiequant Jun 13 '16 at 10:00
  • 1
    at least for centos, we also need instruction how to install 7z – stiv Jun 10 '19 at 17:07
  • @Energiequant If you already used 7zip to create multipart, you do not need to rename files in this format. – Ananth Jun 05 '20 at 01:24
  • Worked perfectly for a multi-part zip made by keka mac app! – Lamp Apr 30 '21 at 07:37
32

I found the answer here: https://superuser.com/a/517758/10264

This answer is similar in concept to that of Gilles, namely first you combine the split archive into a normal archive using split, and then you unpack it using unzip.

The difference is that instead of using the -FF flag, which did not work for me, you just tell zip to repack the split file without splitting. That is what the -s 0 flag means in the manual.

A split archive can also be converted into a single-file archive using a split size of 0: zip -s 0 test.zip -O single.zip

So, first, combine the split archive to a single archive:

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

Then, extract the single archive using unzip:

unzip unsplit-foo.zip

This approach only works for .z01, .z02, ..., .zip file structure. If your filenames are .zip.001, .zip.002..., you have rename them first using (e.g.) rename zip.0 z test.zip* with rename.

AdminBee
  • 22,803
  • 3
    This is the correct answer for zip 3.x – SwiftMango Oct 19 '17 at 00:49
  • it works for me – ji-ruh Apr 06 '21 at 08:25
  • In my case this corrupts some output files, or even fails. Seems it’s because it’s too big (30 files of 100MB). Well… the zip command-line tools haven’t had a release in more than 10 years (even though they get patched by distros since there were several vulnerabilities). I think from now on I will consider these tools as broken, and use 7zip instead. – Didier L Nov 30 '22 at 18:52
14

I think it's worth mentioning that the unar command-line tool is able to unZip, unRar, un7zip, unTar etc, including splitted files, with just:

unar first_file

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

  • underrated comment: i've tried so many variations of the other answers that didn't work, using unar is a game-changer! – therightstuff May 14 '20 at 09:11
  • 1
    It also comes with lsar command. Do lsar first_file to list the content of the files (and maybe test incompleteness in multipart files) – Rutrus Feb 09 '21 at 19:08
  • just a note, this will probably work on Ubuntu only – jjj Nov 05 '21 at 10:30
  • on debian I get random Archive parsing failed! (Unknown error.) errors. WinRAR 5.0 on Windows can extract the *.001 files perfectly fine. – anonymous Feb 17 '22 at 16:39
3

The following works for me on Ubuntu 18.04.

  • split the compressed file into multiple archives, each is less than 1024MB
    zip -s 1024m -r target.zip target/
    
  • get the files: target.z01, target.z02, ..., target.zip

  • before unzip them, combine them into one whole zip file

    zip -FF target.zip --out target-full.zip
    unzip target-full.zip
    
  • remove all the .z* file

    rm *.z*
    
AdminBee
  • 22,803
husi253
  • 31
  • Welcome to the site, and thank you for your contribution. Please note, though, that it is rather similar in content this answer by @Gilles. Therefore, please consider editing your post to make the difference in your approach more visible. Also, you write "before unzip them, combine them into one whole zip file", but the instructions on how to do so seem to be incomplete (what happened to target.z01 etc.?). – AdminBee Apr 28 '20 at 07:01
  • This line zip -FF target.zip --out target-full.zip will dump all the target.z* files into the target-full.zip. And it does not need to explicitly write something for target.z01 etc. – husi253 Apr 29 '20 at 17:48
2

For a multipart zip coming from a Google Drive download I tried several of the explained methods but didn't work (well). I could finally do it in a simple way from the terminal: unzip filename.zip.001 when finished extracting the same with the next part: unzip filename.zip.002 and so on ...

Another option: 7z x filename.zip.001 when finished extracting the same with the next part: 7z x filename.zip.002 and so on ...

  • Yep. I think Google Drive zip files are not a split multi-part zip. They are just independent zip files! – a06e Nov 13 '22 at 21:33
1

Note that some of the answers will not work as expected when having more than 10 files, because they will be sorted in the wrong order (alphabetical instead of numerical):

file1 file10 file2

To preserve ordering on large number of files, use:

find ./ -name "*.zip.*" | sort -V | xargs cat > full.zip

yogi
  • 151
0

Just another example. This worked for me in bash to split 3GB oracle installer:

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
guicey
  • 101
  • This looks very similar to previous answers. Can you explain what it is doing, and how it differs from what’s already been posted? Please do not respond in comments; [edit] your answer to make it clearer and more complete. – Scott - Слава Україні Nov 03 '17 at 18:19
  • Hi Scot, i wish i could answer in the comments but i have to little points to do that right now. This answer gives a complete list of commands to split, merge and unzip a large file on unix. I will provide more explaining text to clarify my answer. Thank you for your reply. – guicey Nov 09 '17 at 09:55
0

If you have a large collection of files or just very big files this command assembly is is pretty handy as it gets you a progress bar:

 $ pv files.zip* | cat - > uberFile.zip
 25.0GiB 0:50:24 [8.48MiB/s] [============================================================>] 100%
 $ unzip uberFile.zip

Just used this to combine and extract a 25Gb split archive.

Zexelon
  • 101
  • 1