Ajouter un file à l'intérieur d'un file zip

Dire que je veux append le file foo.zip à foo.zip , je pourrais juste faire zip -u foo.zip file.txt .

Cependant à l'intérieur du file zip existe déjà un dossier avec le path foo.zip/very/many/paths/ (relativement au file zip).

Comment puis-je append file.txt au file zip de sorte que son location dans le file zip soit foo.zip/very/many/paths/file.txt ?

Je pourrais créer la structure de directory nécessaire en premier, mais n'y a-t-il pas un moyen plus facile?

Je le ferais normalement comme ça:

 $ ls
 file.txt
 foo.zip
 $ mkdir très
 $ mkdir très / beaucoup
 $ mkdir très / plusieurs / paths
 $ cp file.txt très / plusieurs / paths
 $ zip -u foo.zip très / beaucoup / paths / file.txt
 $ rm -rf très

Utiliser la bibliothèque zipfile de Python?

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

D'accord. Il n'y a pas de 'test.zip' en ce moment …

 ~/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 

Ajoutons '/ etc / motd' comme 'text / motd' au file zip inexistant …

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

La bibliothèque zipfile était assez agréable pour créer '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 

..et il semble contenir ce que je voulais …

Vérifions-le en le décompressant à 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 dissortingbution 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. 

Bien!

Maintenant nous ajoutons un 2ème 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$ _ 

J'espère que ça aide!

Un moyen que je suggère est en décompressant, en déplaçant le file, puis en le compressant de nouveau.

Par exemple, disons que nous avons ce file zip:

 Archive: foo.zip Length Date Time Name --------- ---------- ----- ---- 0 2013-01-30 14:38 very/ 0 2013-01-30 14:38 very/many/ 0 2013-01-30 14:38 very/many/paths/ 0 2013-01-30 14:38 very/many/paths/foo.txt 0 2013-01-30 14:38 file.txt --------- ------- 0 5 files 

Pour décompresser le file, créons d'abord un directory dans /tmp . Ensuite, nous effectuerons les actions suivantes:

  1. Décompressez foo.zip dans notre directory temporaire
    d=$(mktemp -t -d foo.zip.XXXXXX) && unzip -d $d foo.zip
  2. Déplacer le file vers son nouveau path (par rapport à temp dir $d )
    mv ${d}/file.txt ${d}/very/many/paths/
  3. Dans le sous-shell: cd to temp dir & Recompresse tout dans un nouveau file zip
    ( cd $d && zip -r foo.zip ./* )
  4. Déplacer le nouveau file zip à partir de temp dir pour replace l'ancien
    mv ${d}/foo.zip ./
  5. Nettoyer 🙂
    rm -rf ${d}