Eu tenho que baixar um arquivo deste link . O download do arquivo é um arquivo zip que precisarei descompactar na pasta atual.
Normalmente, eu deveria baixá-lo primeiro e depois executar o comando descompactar.
$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
$ unzip temp.zip
Mas dessa forma, preciso executar dois comandos, aguardar a conclusão do primeiro para executar o próximo, além disso, preciso saber o nome do arquivo temp.zip
para o qual dar unzip
.
É possível redirecionar a saída de wget
para unzip
? Algo como
$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`
Mas não deu certo.
bash ::
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
redirecionamento ambíguo
Além disso, wget
foi executado duas vezes e baixou o arquivo duas vezes.
command-line
io-redirection
Andrew-Dufresne
fonte
fonte
Respostas:
Você precisa baixar seus arquivos para um arquivo temporário, porque (citando a página de manual descompactar):
Basta reunir os comandos:
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip
Mas, para torná-lo mais flexível, você provavelmente deve colocá-lo em um script para salvar algumas digitações e, para garantir que não substitua acidentalmente algo, use o
mktemp
comando para criar um nome de arquivo seguro para o seu arquivo temporário:fonte
wget file.zip && unzip file.zip
igualwget file.zip; unzip file.zip
ou prefere um ao outro? Obrigado :)wget && unzip
será descompactado apenas se o wget for bem-sucedido.wget ; unzip
executará o descompactação de qualquer maneira, possivelmente apontando para um arquivo inexistente.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
.zip
arquivo aqui que contém arquivos com permissões executáveis. Quando eu baixo e entrobsdtar
, os bits de exec são jogados fora. Quando eu faço o download em disco e extraio combsdtar
ouunzip
então, os bits exec são respeitados.bsdtar
abertura do arquivo, é possível procurar ou não o uso de um ou outro local.Se você tiver o JDK instalado, poderá usar
jar
:fonte
jar
não preserva as permissões de arquivo. Bom truque caso contrário.| jar xv
Eu acho que você nem quer incomodar a saída do wget da tubulação para descompactar.
No artigo "ZIP (formato de arquivo)" da wikipedia :
O wget precisa concluir completamente o download antes que o descompactamento possa executar qualquer trabalho, para que sejam executados seqüencialmente, não entrelaçados como se poderia pensar.
fonte
A sintaxe adequada seria:
mas não funcionará, devido ao erro ( Info-ZIP no Debian ):
ou no BSD / OS X:
Isso ocorre porque as ferramentas zip padrão usam principalmente a
lseek
função para definir o deslocamento do arquivo no final para ler o final do registro do diretório central . Ele está localizado no final da estrutura do arquivo morto e é necessário ler a lista dos arquivos (consulte: Estrutura de formato de arquivo zip ). Portanto, o arquivo não pode ser FIFO, canal, dispositivo terminal ou qualquer outra dinâmica, porque o objeto de entrada não pode ser posicionado pelalseek
função.Então você tem as seguintes soluções alternativas:
tar.gz
),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
Isso funciona muito bem para mim:
fonte