Descompacte de stdin para stdout - funzip, python

2

O objetivo é ler um arquivo zip de stdin e descompactar para stdout.

O Funzip funciona e é a solução que estou procurando, o zip contém um único arquivo, infelizmente o funzip falha quando o tamanho do arquivo compactado é de aproximadamente 1 GB ou maior:

funzip error: invalid compressed data--length error

Atualização: descobri que o erro acima pode não indicar um erro real. Comparando dois arquivos descomprimidos, um descompactado tradicionalmente e outro através de um pipe usando o funzip (com o erro acima escrito para stderr) os arquivos são idênticos. Eu gostaria de manter isso em aberto, para que isso possa ser confirmado ou relatado.

Uma solução relacionada usando python: Descompactando arquivos que estão voando através de um tubo

No entanto, esta saída é direcionada para um arquivo.

    
por chillvibes 12.11.2015 / 17:01

3 respostas

5

Use simplesmente zcat . Por exemplo:

cat file.zip | zcat

Por favor, note que no exemplo acima a primeira parte ( cat file.zip ) é redundante, no sentido de que você pode simplesmente emitir zcat file.zip e ter os mesmos resultados. Eu incluí-lo apenas para mostrar que zcat é capaz de ler a partir de stdin

    
por 12.11.2015 / 18:45
2

Descompactando (com redirecionamento para file ):

cat file.gz | gunzip -c - > file

Compressão (com redirecionamento para file.gz )):

cat file | gzip -c - > file.gz
    
por 13.12.2015 / 09:24
0

Repost de minha resposta :

O unzip do BusyBox pode pegar stdin e extrair todos os arquivos para o stdout. Por exemplo, quando você usa wget como stdin,

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -p -

-p para extrair arquivos para o pipe. O traço depois é usar stdin como entrada.

Você também pode, (assim como resposta anterior )

cat file.zip | busybox unzip -p -

Mas isso é apenas redundante de unzip -p file.zip .

Se a sua distro usar o BusyBox por padrão (por exemplo, Alpine), basta executar unzip -p - .

    
por 11.10.2018 / 14:31