Atualizando um arquivo em um arquivo zip de STDIN

2

Desejo atualizar / atualizar um arquivo em um arquivo zip com o conteúdo de stdin . Até agora não consegui encontrar uma maneira de dizer ao comando zip que o conteúdo de stdin corresponde a um arquivo específico.

Por exemplo (a última linha é como esperaria que funcionasse, mas não faz alterações no arquivo zip):

~/D/tmp ♪ unzip -l sample.odt # an odt file is actually a zip file
Archive:  sample.odt
  Length     Date   Time    Name
 --------    ----   ----    ----
       39  01-06-10 00:46   mimetype
        0  01-06-10 00:46   Configurations2/statusbar/
        0  01-06-10 00:46   Configurations2/accelerator/current.xml
        0  01-06-10 00:46   Configurations2/floater/
        0  01-06-10 00:46   Configurations2/popupmenu/
        0  01-06-10 00:46   Configurations2/progressbar/
        0  01-06-10 00:46   Configurations2/menubar/
        0  01-06-10 00:46   Configurations2/toolbar/
        0  01-06-10 00:46   Configurations2/images/Bitmaps/
     3374  01-06-10 00:46   content.xml
    11837  01-06-10 00:46   styles.xml
      957  01-06-10 00:46   meta.xml
     1060  01-06-10 00:46   Thumbnails/thumbnail.png
     8086  01-06-10 00:46   settings.xml
     1889  01-06-10 00:46   META-INF/manifest.xml
 --------                   -------
    27242                   15 files
~/D/tmp ♪ unzip -p sample.odt meta.xml > tmp.xml
~/D/tmp ♪ # modify tmp.xml somehow
~/D/tmp ♪ cat tmp.xml | zip sample.odt -u meta.xml

EDIT (Extraído do meu comentário abaixo): Não posso simplesmente carregar o arquivo diretamente no arquivo zip referenciando a nova versão porque a extração inicial nunca está sendo redirecionada para um arquivo na minha situação real. Em vez disso, para um banco de dados onde ele passa por algum processamento de texto em uma fila de segundo plano. É então substituído de volta no documento sob demanda.

    
por Bo Jeanes 07.01.2010 / 06:39

2 respostas

3

Existe uma razão pela qual você não pode simplesmente fazer:

unzip -p sample.odt meta.xml
#modify meta.xml
zip sample.odt -u meta.xml
rm meta.xml

Então você não precisa se preocupar em fazer girações estranhas para canalizar tudo de volta em

Em resposta ao seu comentário, as duas únicas sugestões que consigo pensar são

a) Grave o arquivo em um diretório temp aleatório /tmp/<random_number>/meta.xml e faça um zip sample.odt -u /tmp/<random_number>/meta.xml

b) Peça no Stack overflow se houver uma maneira programática de manipular seu arquivo zip.

    
por 07.01.2010 / 06:49
1

A página zip man descreve como um único traço pode ser usado para representar STDIN ou STDOUT em uma linha de comando, portanto zip pode ser usado em um pipeline.

Procure Entrada e saída de streaming na página do manual.

MAS, uma vez que você está usando STDIN e não especificando um nome de arquivo com este método, ele não funcionará como você gostaria com arquivos zip muti-file.

Como a menção de gunzip na página man sugere, ele é destinado a arquivos contendo arquivos únicos.

Da mesma forma, gzip filename produz filename.gz, zip pode produzir filename.zip , exceto que o zip exige que você nomeie explicitamente o arquivo zip .

AQUI ESTÁ um novo post relevante sobre o SO. Eu quase caí da cadeira quando vi isso.

    
por 07.01.2010 / 06:46