Come reindirizzare loutput di wget come input da decomprimere?

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

Normalmente, lo scaricerei prima, quindi eseguirò 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 assegnarlo a unzip.

È possibile reindirizzare loutput di wget a unzip? Qualcosa di simile

$ 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.

Commenti

  • In questultimo esempio, wget probabilmente è stato eseguito due volte perché? è un carattere speciale nella shell . Linserimento dellURL in ” ” dovrebbe aiutare.
  • Questo thread sembra avere una soluzione. Haven ‘ però non lho provato io stesso. serverfault.com/questions/26474/…

Risposta

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

Gli archivi letti dallo standard input non sono ancora supportati, eccetto con funzip (e quindi solo il primo m la brace dellarchivio può essere estratta).

Basta riunire 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 risparmiare un po di digitazione e per assicurarti di non sovrascrivere accidentalmente qualcosa potresti usare 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 

Commenti

  • È wget file.zip && unzip file.zip è uguale a wget file.zip; unzip file.zip o è uno preferito rispetto allaltro? Grazie 🙂
  • @NextLocal wget && unzip verrà eseguito unzip solo se wget ha avuto successo. wget ; unzip verrà eseguito comunque unzip, probabilmente indicando un file inesistente.
  • funzip era la risposta che stavo cercando. Terraform (per qualche motivo) lo impacchetta ‘ come un singolo file in un archivio zip, quindi per me era perfetto.

Rispondi

Questo è un repost della mia risposta a una domanda simile:

Il formato del file ZIP include una directory (indice) alla fine dellarchivio. Questa directory indica dove si trova ciascun file allinterno dellarchivio e consente quindi un accesso rapido e casuale, senza leggere lintero archivio.

Ciò sembrerebbe rappresentare un problema quando si tenta di leggere un archivio ZIP tramite un pipe, in quanto non si accede allindice fino alla fine e quindi i singoli membri non possono essere estratti correttamente fino a quando il file non è stato letto completamente e non è più disponibile. In quanto tale, non sorprende che la maggior parte dei decompressori ZIP fallisca semplicemente quando larchivio viene fornito tramite una pipe.

La directory alla fine dellarchivio non è lunica posizione in cui meta file le informazioni vengono memorizzate nellarchivio. Inoltre, le singole voci includono anche queste informazioni in unintestazione di file locale, per scopi di ridondanza.

Sebbene non tutti i decompressori ZIP utilizzino intestazioni di file locali quando lindice non è disponibile, i front-end di tar e cpio per libarchive (ovvero bsdtar e bsdcpio) possono e lo faranno quando leggendo attraverso una pipe, il che significa che è possibile quanto segue:

wget -qO- http://example.org/file.zip | bsdtar -xvf- 

Commenti

  • Questo è eccellente ! Vorrei notare che tar mi dà alcuni avvertimenti sul fatto che i dati non compressi sono di dimensioni errate (previsto 0), ma i file stessi sembrano non danneggiati. Immagino che ciò sia dovuto alla mancanza dellindice.
  • Ho un .zip -file che contiene file con autorizzazioni eseguibili. Quando scarico e installo in bsdtar, i bit di esecuzione vengono gettati via. Quando scarico su disco ed estraggo con bsdtar o unzip, i bit exec vengono rispettati.
  • // , @GolarRamblar, non hai mai scoperto perché?
  • @NathanBasanese: qui è la risposta. In breve: un archivio ZIP ha due posizioni in cui memorizza tali informazioni, che possono essere incoerenti e, a seconda che il file bsdtar aperto sia ricercabile o meno, utilizza luna o laltra posizione .

Risposta

Se hai installato JDK, puoi utilizzare jar:

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin 

Commenti

  • Ho appena scoperto che jar ‘ non conserva i permessi sui file. Altrimenti bel trucco.
  • Non ‘ è necessario fornire un parametro per il file, basta usare | jar xv
  • Anchio sono stato morso dallipotesi che jar potesse essere utilizzato in sostituzione di unzip; Purtroppo jar non ripristina i file estratti ‘ autorizzazioni;
  • Utilizza solo | jar x
  • jar gestisce molto meglio i nomi di file UTF-8. unzip ha distrutto le cose.

Risposta

Io non “t penso che tu voglia persino disturbare loutput di wget in unzip.

Dallarticolo “ZIP (formato file)” di wikipedia:

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.

Risposta

Ripubblicare di la mia risposta :

BusyBox “s unzip 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 serve per usare stdin come input.

Puoi anche,

cat file.zip | busybox unzip - 

Ma questo “è solo ridondante di unzip file.zip.

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

Commenti

  • oltre a @Saftever ‘ s risposta, a cui ‘ non è consentito commentare, busybox funzionerà ma le versioni precedenti alla 1.27.0 hanno vinto ‘ a causa di un lseek ridondante, vedere il log delle modifiche busybox.net

Risposta

La sintassi corretta sarebbe:

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

ma non funzionerà, a causa dellerrore ( 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 

Ciò è dovuto al fatto che gli strumenti zip standard utilizzano principalmente lseek funzione per impostare loffset del file alla fine per leggere il suo record di directory centrale . Si trova alla fine della struttura dellarchivio ed è necessario per leggere lelenco dei file (vedi: Struttura del formato di file zip ). Pertanto il file non può essere FIFO, pipe, dispositivo terminale o qualsiasi altra dinamica, perché loggetto di input non può essere posizionato dalla funzione lseek.

Quindi hai la soluzioni alternative seguenti:

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

Commenti

  • Penso che potrebbe essere ancora un FIFO. Devi ‘ continuare a leggere dal FIFO fino allEOF (eseguendo effettivamente il buffering dellintero FIFO in memoria o in un file temporaneo). Completamente fattibile per facilitare la creazione di script, ma non molto utile.

Risposta

Se cè un solo file in zip, puoi utilizzare zcat o gunzip:

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

FYI: ecco le definizioni di gunzip e zcat sul mio sistema:

$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@" 

Risposta

Un archivio zip non è sequenziale perché spesso ha il sommario alla fine del file, quindi è difficile decomprimerlo in streaming.

Una soluzione alternativa è vedere se è possibile ottenere un altro formato di file, come .tar.gz.

Ad esempio, se stai scaricando un file .zip da GitHub, cè quasi sempre un .tar.gz versione disponibile.

Ad esempio,

Nota il modello: basta sostituire .zip con .tar.gz e aggiungere il pipe a | tar xzf -

Risposta

Per me funziona abbastanza bene:

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -  

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *