Add file to deep inside a zip file

zip

Say I want to add the file file.txt to foo.zip, I could just do zip -u foo.zip file.txt.

However inside the zip-file there already exist a folder with the path foo.zip/very/many/paths/ (relatively to the zip-file).

How would I add file.txt to the zip-file so it's location inside the zip-file would be foo.zip/very/many/paths/file.txt?

I could create the directory structure needed first, but isn't there an easier way?

I would normally do it like this:

$ ls
file.txt
foo.zip
$ mkdir very
$ mkdir very/many
$ mkdir very/many/paths
$ cp file.txt very/many/paths
$ zip -u foo.zip very/many/paths/file.txt
$ rm -rf very

Best Answer

Use Python's zipfile library?

~/wrk/tmp$ ls test.zip
ls: cannot access test.zip: No such file or directory

Ok. There is no 'test.zip' right now...

~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.a
rgv[2],sys.argv[3])' test.zip /etc/motd text/motd

Let's add '/etc/motd' as 'text/motd' to the nonexisting zipfile...

~/wrk/tmp$ ls -l test.zip 
-rw-r--r-- 1 yeti yeti 473 Mar 23 09:51 test.zip

The zipfile library was nice enough to create 'test.zip'.

~/wrk/tmp$ unzip -lv test.zip 
Archive:  test.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
     357  Stored      357   0% 2014-03-20 15:47 ff1b8b7f  text/motd
--------          -------  ---                            -------
     357              357   0%                            1 file

..and it seems to contain what I wated...

Let's check it by unzipping it to stdout...

~/wrk/tmp$ unzip -p test.zip text/motd
Linux aurora 3.2.0-0.bpo.4-amd64 #1 SMP Debian 3.2.54-2~bpo60+1 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Fine!

Now we add a 2nd file...

~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' test.zip /etc/issue otherdir/issue
~/wrk/tmp$ ls -l test.zip 
-rw-r--r-- 1 yeti yeti 605 Mar 23 09:52 test.zip
(yeti@aurora:1)~/wrk/tmp$ unzip -lv test.zip 
Archive:  test.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
     357  Stored      357   0% 2014-03-20 15:47 ff1b8b7f  text/motd
      28  Stored       28   0% 2012-09-21 22:52 f9c3990c  otherdir/issue
--------          -------  ---                            -------
     385              385   0%                            2 files
~/wrk/tmp$ unzip -p test.zip otherdir/issue                                            Debian GNU/Linux 6.0 \n \l

~/wrk/tmp$ _
Related Question