Adiciona o arquivo em um arquivo zip

6

Digamos que eu queira adicionar o arquivo file.txt a foo.zip , eu poderia fazer apenas zip -u foo.zip file.txt .

No entanto, dentro do arquivo zip, já existe uma pasta com o caminho foo.zip/very/many/paths/ (relativamente ao arquivo zip).

Como eu adicionaria file.txt ao arquivo zip para que a localização dentro do arquivo zip fosse foo.zip/very/many/paths/file.txt ?

Eu poderia criar a estrutura de diretórios necessária primeiro, mas não há uma maneira mais fácil?

Eu normalmente faria assim:

$ 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
    
por Tyilo 16.01.2013 / 20:56

2 respostas

1

Use a biblioteca zipfile do Python?

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

Ok. Não há 'test.zip' agora ...

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

Vamos adicionar '/ etc / motd' como 'text / motd' ao arquivo zip não existente ...

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

A biblioteca zipfile foi legal o suficiente para criar '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

.. e parece conter o que eu queria ...

Vamos verificar isso descompactando-o para 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.

Ótimo!

Agora adicionamos um segundo arquivo ...

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

Espero que isso ajude!

    
por 23.03.2014 / 10:04
0

Uma maneira que eu sugeriria é descompactar, mover o arquivo e, em seguida, comprimir novamente.

Como exemplo, digamos que temos este arquivo 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

Para descompactar o arquivo, vamos criar um diretório em /tmp first. Em seguida, executaremos as seguintes ações:

  1. Descompacte foo.zip em nosso diretório temporário em d=$(mktemp -t -d foo.zip.XXXXXX) && unzip -d $d foo.zip
  2. Mover o arquivo para o novo caminho (relativo ao diretório temporário $d )
    mv ${d}/file.txt ${d}/very/many/paths/
  3. Em subshell: cd para temp dir & Recompile tudo em um novo arquivo zip
    ( cd $d && zip -r foo.zip ./* )
  4. Mover o novo arquivo zip do dir temporário para substituir o antigo. mv ${d}/foo.zip ./
  5. Limpeza :-)
    rm -rf ${d}
por 30.01.2013 / 22:56

Tags