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 awget 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 inbsdtar
, i bit di esecuzione vengono gettati via. Quando scarico su disco ed estraggo conbsdtar
ounzip
, 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 diunzip
; Purtroppojar
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,
- https://github.com/madler/zlib/archive/v1.2.11.zip
- https://github.com/madler/zlib/archive/v1.2.11.tar.gz
- https://github.com/curl/curl/archive/curl-7_68_0.zip
- https://github.com/curl/curl/archive/curl-7_68_0.tar.gz
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 -