it-swarm.it

Come reindirizzare l'output di wget come input per decomprimerlo?

Devo scaricare un file da questo link . Il download del file è un file Zip che dovrò decomprimere nella cartella corrente.

Normalmente, lo scaricarei prima, quindi eseguo il comando unzip.

$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.Zip
$ unzip temp.Zip

Ma in questo modo, devo eseguire due comandi, attendere il completamento del primo per eseguire il successivo, inoltre, devo conoscere il nome del file temp.Zip per darlo a unzip.

È possibile reindirizzare l'output di wget su unzip? Qualcosa di simile a

$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`

Ma non ha funzionato.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.Zip: reindirizzamento ambiguo

Inoltre, wget è stato eseguito due volte e scaricato il file due volte.

142
Andrew-Dufresne

Devi scaricare i tuoi file in un file temporaneo, perché (citando la pagina man di decompressione):

Gli archivi letti dallo standard input non sono ancora supportati, tranne con funzip (e quindi solo il primo membro dell'archivio può essere estratto).

Basta unire i comandi:

wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.Zip; unzip temp.Zip; rm temp.Zip

Ma per renderlo più flessibile dovresti probabilmente inserirlo in uno script in modo da salvare un po 'di battitura e per assicurarti di non sovrascrivere accidentalmente qualcosa, potresti usare il comando mktemp per creare un nome file sicuro per il tuo file temporaneo:

#!/bin/bash
TMPFILE=`mktemp`
PWD=`pwd`
wget "$1" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE
105
tante

Questo è un repost di la mia risposta a una domanda simile:

Il formato del file Zip include una directory (indice) alla fine dell'archivio. Questa directory indica dove si trova ogni file all'interno dell'archivio e consente quindi un accesso rapido e casuale, senza leggere l'intero archivio.

Ciò sembra costituire un problema quando si tenta di leggere un archivio Zip attraverso una pipe, in quanto l'indice non è accessibile fino alla fine e quindi i singoli membri non possono essere estratti correttamente fino a quando il file non è stato letto interamente e non è più disponibile . Pertanto, non sorprende che la maggior parte dei decompressori Zip non riesca semplicemente quando l'archivio viene fornito attraverso una pipe.

La directory alla fine dell'archivio non è la posizione solo in cui sono archiviate le meta informazioni del file nell'archivio. Inoltre, le singole voci includono anche queste informazioni in un'intestazione di file locale, a fini di ridondanza.

Sebbene non tutti i decompressori Zip utilizzeranno le intestazioni di file locali quando l'indice non è disponibile, i front-end tar e cpio terminano con libarchive (aka bsdtar e bsdcpio) possono e saranno durante la lettura di una pipe, ciò significa che è possibile:

wget -qO- http://example.org/file.Zip | bsdtar -xvf-
84
ruario

Se hai installato JDK, puoi usare jar:

wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
22
Rory Hunter

Non penso nemmeno che tu voglia disturbare il piping dell'output di wget in unzip.

Dall'articolo di Wikipedia "Zip (formato file)" articolo:

Un file Zip è identificato dalla presenza di una directory centrale situata alla fine del file.

wget deve terminare completamente il download prima che unzip possa fare qualsiasi lavoro, quindi vengono eseguiti in sequenza, non intrecciati come si potrebbe pensare.

15
Bruce Ediger

La sintassi corretta sarebbe:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.Zip)

ma non funzionerà, a causa dell'errore ( Info-Zip su Debian ):

lseek(3, 0, SEEK_SET)                   = -1 ESPIPE (Illegal seek)

Archive:  /dev/fd/63
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of /dev/fd/63 or
        /dev/fd/63.Zip, and cannot find /dev/fd/63.Zip, period.

o su BSD/OS X:

Trying to read large file (> 2 GiB) without large file support

Questo perché gli strumenti Zip standard utilizzano principalmente lseek function al fine di impostare l'offset del file alla fine per leggere la sua fine del centro record di directory . Si trova alla fine della struttura dell'archivio ed è necessario per leggere l'elenco dei file (vedere: Struttura del formato del file zip ). Pertanto il file non può essere FIFO, pipe, dispositivo terminale o qualsiasi altra dinamica, in quanto l'oggetto di input non può essere posizionato dalla funzione lseek.

Quindi hai le seguenti soluzioni alternative:

  • utilizza diversi tipi di compressione (ad esempio tar.gz),
  • devi usare due comandi separati,
  • utilizzare strumenti alternativi (come suggerito in altre risposte),
  • creare un alias o una funzione per utilizzare più comandi.
11
kenorb

Repost of la mia risposta :

unzip di BusyBox può prendere stdin ed estrarre tutti i file.

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

Il trattino dopo unzip è usare stdin come input.

Puoi persino

cat file.Zip | busybox unzip -

Ma questo è solo ridondante di unzip file.Zip.

Se la tua distribuzione utilizza BusyBox per impostazione predefinita (ad es. Alpine), esegui semplicemente unzip -.

11
Saftever

Se in Zip è presente un solo file, puoi utilizzare zcat o gunzip:

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip

Cordiali saluti: Ecco le definizioni di gunzip e zcat sul mio sistema:

$ grep ^exec $(which gunzip zcat)
/bin/gunzip:exec gzip -d "[email protected]"
/bin/zcat:exec gzip -cd "[email protected]"
0
SebMa

Un archivio Zip non è sequenziale (poiché può contenere il sommario alla fine del file), quindi è difficile decomprimerlo in streaming. Prova a vedere se riesci a ottenere un altro formato di file, come .tar.gz.

Se stai scaricando un .Zip file da GitHub, c'è quasi sempre un .tar.gz versione disponibile.

Per esempio,

Notare lo schema? Sostituisci semplicemente .Zip con .tar.gz e pipe a | tar xzf -

0
rustyx