Posso fazer com que o descompacte ou que programas semelhantes funcionem na saída padrão? A situação é que estou baixando um arquivo zip, que deve ser descompactado em tempo real.
Problema relacionado: Como canalizar um arquivo baixado para a saída padrão no bash?
linux
ubuntu
pipe
compression
Alex
fonte
fonte
Respostas:
Embora um arquivo zip seja de fato um formato de contêiner, não há razão para que ele não possa ser lido em um canal (stdin) se o arquivo puder caber na memória com bastante facilidade. Aqui está um script Python que utiliza um arquivo zip como entrada padrão e extrai o conteúdo para o diretório atual ou para um diretório especificado, se especificado.
Esse script pode ser minificado para uma linha e criado como um alias.
Agora descompacte a saída do wget facilmente.
fonte
.read()
métodoÉ improvável que funcione como você espera. Zip não é apenas um formato de compactação, mas também um formato de contêiner. Ele acumula os trabalhos do tar e do gzip.bzip2 em um. Dito isto, se o seu zip tiver um único arquivo, você pode usar o descompacte -p para extrair os arquivos para o stdout. Se você tiver mais de um arquivo, não há como saber onde eles começam e param.
Quanto à leitura de stdin, a página de manual descompactar tem esta frase:
Você pode ter alguma sorte com o funzip.
fonte
O que você quer fazer é
unzip
pegar um arquivo ZIP em sua entrada padrão e não como argumento. Isso geralmente é facilmente suportado porgzip
etar
tipo de ferramentas com um-
argumento. Mas o padrãounzip
não faz isso (no entanto, ele suporta extração para um tubo). No entanto, nem tudo está perdido...Veja a página de manual do funzip .
Isso vai bem com a idéia de que a maioria dos arquivos linux são geralmente TAR'ed e depois zipados de alguma forma (gzip, bzip, et al). Isso funcionará para você se você tiver um
tar.ZIP
.Vale ressaltar que
funzip
foi escrito pelo autor original do Info-ZIP Mark Adler. Ele escreve na página de manual do funzip,no entanto, nenhuma atualização é vista por aí. Suspeito que Mark tenha achado desnecessário, pois outros métodos de arquivamento funcionaram facilmente com o TAR.
fonte
Eu gosto de usar o curl porque ele é instalado por padrão (o
-L
necessário para redirecionamentos que geralmente ocorrem):No entanto,
bsdtar
não está instalado por padrão e não conseguifunzip
trabalhar.fonte
Esta é uma resposta da minha resposta a uma pergunta semelhante:
O formato do arquivo ZIP inclui um diretório (índice) no final do arquivo morto. Esse diretório diz onde, dentro do arquivo, cada arquivo está localizado e, portanto, permite acesso rápido e aleatório, sem a leitura de todo o arquivo.
Isso parece representar um problema ao tentar ler um arquivo ZIP por meio de um canal, pois o índice não é acessado até o final e, portanto, os membros individuais não podem ser extraídos corretamente até depois que o arquivo foi totalmente lido e não está mais disponível . Como tal, não surpreende que a maioria dos descompressores ZIP simplesmente falhe quando o arquivo é fornecido através de um tubo.
O diretório no final do arquivo morto não é o único local em que as meta informações do arquivo são armazenadas no arquivo morto. Além disso, entradas individuais também incluem essas informações em um cabeçalho de arquivo local, para fins de redundância.
Embora nem todos os descompactadores ZIP usem cabeçalhos de arquivos locais quando o índice estiver indisponível, os front-ends tar e cpio para libarchive (também conhecidos como bsdtar e bsdcpio) podem e o fazem ao ler através de um canal , o que significa que o seguinte é possível:
fonte
Não é possível com o Info-Zip, que é a implementação OSS mais comum. Mais importante, porém, não é recomendado devido às construções dos arquivos ZIP.
Se uma mudança de formato for viável para você, considere usar tar (1). É bastante feliz com a entrada / saída transmitida e, de fato, espera isso por padrão.
Além disso, muitas vezes você pode dizer se os aplicativos esperam entrada / saída em fluxo contínuo especificando "-" para um nome de arquivo. O Info-Zip, como você pode imaginar, não trata isso como um argumento válido.
fonte
No zsh, você pode fazer o seguinte:
fonte
O utilitário comum mais simples disponível que fará isso é o
jar
que presumirá que STDIN está sendo usado se você não passar nenhum argumento de arquivo. Também aceita argumentos semelhantes aotar
programa de operações.por exemplo, liste o conteúdo de um arquivo
curl https://my.example.com/file.zip | jar t
Embora o Java nem sempre esteja instalado, nas máquinas onde está,
jar
é definitivamente o método mais conveniente de fazer isso.fonte
Repost da minha resposta :
O BusyBox
unzip
pode pegar o stdin e extrair todos os arquivos.O ponto a seguir
unzip
é usar stdin como entrada.Você também pode,
Mas isso é apenas redundante
unzip file.zip
.Se sua distribuição usar o BusyBox por padrão (por exemplo, Alpine), basta executar
unzip -
.fonte
Na verdade, eu precisava de algo um pouco mais complexo - extraia um arquivo específico, se existir. A dificuldade é que o fluxo do arquivo de entrada pode não ser um arquivo zip e, nesse caso, eu precisava que ele continuasse no canal. Aqui está a minha solução (graças principalmente à solução Jason R. Coombs)
Salvei isso como um arquivo chamado "effpoptp" (não é um nome simples) na pasta "/ bin" da minha máquina, para testar da seguinte forma:
O objetivo é controlar os arquivos do MySQL Workbench, onde o arquivo pode ser o arquivo xml nomeado como arquivo do workbench ou o arquivo completo do workbench.
fonte