Jeg må laste ned en fil fra denne -linken . Filnedlastingen er en zip-fil som jeg må pakke ut i den gjeldende mappen.
Normalt vil jeg laste den ned først, og deretter kjøre utpakningskommandoen.
$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip $ unzip temp.zip
Men på denne måten må jeg utføre to kommandoer, vente på ferdigstillelsen av den første for å utføre den neste, også må jeg vite navnet på filen temp.zip
for å gi den til unzip
.
Er det mulig å omdirigere utdata fra wget
til unzip
? Noe som
$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834`
Men det fungerte ikke.
bash:
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
: tvetydig omdirigering
wget
ble også henrettet to ganger og lastet ned filen to ganger.
Kommentarer
- I sistnevnte eksempel ble wget sannsynligvis utført to ganger fordi? er et spesialtegn i skallet . Å sette nettadressen i » » s skal hjelpe.
- Denne tråden ser ut til å ha en løsning. Haven ‘ t prøvde det selv. serverfault.com/questions/26474/…
Svar
Du må laste ned filene dine til en temp-fil, fordi (siterer utpakningen manside):
Arkiv som er lest fra standardinngang, støttes ennå ikke, bortsett fra med funzip (og da bare den første m arkivet kan hentes).
Bare ta kommandoene sammen:
wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip unzip temp.zip rm temp.zip
Men for å gjøre det mer fleksibelt, bør du sannsynligvis legge det inn i et skript, slik at du sparer litt inntasting og for å sikre at du ikke ved et uhell overskriver noe du kan bruke mktemp
kommando for å lage et trygt filnavn for temp-filen din:
#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE
Kommentarer
- Er
wget file.zip && unzip file.zip
det samme somwget file.zip; unzip file.zip
eller foretrekkes det ene fremfor det andre? Takk 🙂 - @NextLocal
wget && unzip
vil bare kjøre pakke ut hvis wget lyktes.wget ; unzip
vil kjøre pakke ut uansett, muligens peke på ikke-eksisterende fil. - funzip var svaret jeg lette etter. Terraform (av en eller annen grunn) pakker den ‘ s binær som en enkelt fil i et zip-arkiv, så dette var perfekt for meg.
Svar
Dette er en repost av mitt svar på et lignende spørsmål:
ZIP-filformatet inkluderer en katalog (indeks) på slutten av arkivet. Denne katalogen sier hvor hver fil ligger i arkivet, og gir dermed rask, tilfeldig tilgang uten å lese hele arkivet.
Dette ser ut til å utgjøre et problem når du prøver å lese et ZIP-arkiv gjennom en pipe, ved at indeksen ikke er tilgjengelig før helt på slutten, og slik at individuelle medlemmer ikke kan trekkes ut riktig før etter at filen har blitt lest helt og ikke lenger er tilgjengelig. Som sådan virker det ikke overraskende at de fleste ZIP-dekompressorer rett og slett mislykkes når arkivet leveres gjennom et rør.
Katalogen på slutten av arkivet er ikke bare stedet der filmeta informasjon lagres i arkivet. I tillegg inkluderer individuelle oppføringer også denne informasjonen i en lokal filoverskrift, for redundansformål.
Selv om ikke alle ZIP-dekompressorer vil bruke lokale filoverskrifter når indeksen ikke er tilgjengelig, vil tar- og cpio-fronten slutte til libarchive (aka bsdtar og bsdcpio) kan og vil gjøre det når lese gjennom et rør, noe som betyr at følgende er mulig:
wget -qO- http://example.org/file.zip | bsdtar -xvf-
Kommentarer
- Dette er utmerket ! Jeg vil merke at tjære gir meg noen advarsler om at ukomprimerte data har feil størrelse (forventet 0), men filene i seg selv ser ut til å være uskadd. Gjette dette skyldes mangelen på indeksen.
- Jeg har en
.zip
-fil her som inneholder filer med kjørbare tillatelser. Når jeg laster ned og piper tilbsdtar
, blir eksekveringsbitene kastet. Når jeg laster ned til disk og trekker ut medbsdtar
ellerunzip
, blir exec-bitene hedret. - // , @GolarRamblar, har du noen gang funnet ut hvorfor?
- @NathanBasanese: her er svaret. Kort sagt: Et ZIP-arkiv har to steder der den lagrer slik informasjon, som kan være inkonsekvent, og avhengig av om filen
bsdtar
åpnes er søkbar eller ikke, bruker den det ene eller det andre stedet .
Svar
Hvis du har JDK installert, kan du bruke jar
:
wget -qO- http://example.org/file.zip | jar xvf /dev/stdin
Kommentarer
- Jeg fant nettopp at
jar
beholder ikke ‘ t filtillatelser. Fint triks ellers. - Du trenger ikke ‘ Du trenger ikke å gi en filparameter, bare bruk
| jar xv
- Også jeg ble bitt av antagelsen enn at
jar
kunne brukes som erstatning forunzip
; Dessverrejar
gjenoppretter ikke ekstraherte filer ‘ tillatelser; - Bare bruk
| jar x
-
jar
er mye hyggeligere å håndtere UTF-8 filnavn.unzip
manglede ting.
Svar
Jeg vet ikke tror du til og med vil bry deg om å røre wget «s utdata til å pakke ut.
Fra wikipedia » ZIP (filformat) « artikkel:
En ZIP-fil identifiseres ved tilstedeværelsen av en sentral katalog som ligger på slutten av filen.
wget må fullføre nedlastingen før utpakking kan gjøre noe, så de kjører sekvensielt, ikke sammenvevd som man skulle tro.
Svar
Repost of mitt svar :
BusyBox «s unzip
kan ta stdin og trekke ut alle filene.
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
Dash etter unzip
er å bruke stdin som input.
Du kan til og med,
cat file.zip | busybox unzip -
Men det er bare overflødig med unzip file.zip
.
Hvis distroen din bruker BusyBo x som standard (f.eks. Alpine), bare kjør unzip -
.
Kommentarer
- videre til @Saftever ‘ s svar, som jeg ‘ ikke har lov til å kommentere, busybox vil fungere, men versjoner eldre enn 1.27.0 vant ‘ t på grunn av et overflødig søk, se changelog busybox.net
Svar
Den riktige syntaksen vil være:
$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)
men den vil ikke fungere på grunn av feilen ( Info-ZIP på 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.
eller på BSD / OS X:
Trying to read large file (> 2 GiB) without large file support
Dette skyldes at standard zip-verktøy hovedsakelig bruker lseek
funksjon for å sette filforskyvningen på slutten for å lese slutten av den sentrale katalogoppføringen . Den ligger på slutten av arkivstrukturen, og det er nødvendig å lese listen av filene (se: Filformatstruktur for zip ). Derfor kan ikke filen være FIFO, rør, terminalenhet eller annen dynamikk, fordi inngangsobjektet ikke kan plasseres av lseek
-funksjonen.
Så du har følgende løsninger:
- bruker annen type komprimering (f.eks.
tar.gz
), - du må bruke to separate kommandoer,
- bruk alternative verktøy (som foreslått i andre svar),
- opprett et alias eller funksjon for å bruke flere kommandoer.
Kommentarer
- Jeg tror det fortsatt kan være en FIFO. Du ‘ d må bare fortsette å lese fra FIFO til EOF (effektivt buffrer hele FIFO i minnet eller i en temp-fil). Helt mulig for å gjøre det lettere å lage skript, men ikke veldig nyttig.
Svar
Hvis det bare er en fil i zip, du kan bruke zcat
eller gunzip
:
wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip
FYI: Her er definisjonene av gunzip
og zcat
på systemet mitt:
$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@"
Svar
Et zip
arkiv er ikke sekvensielt fordi det ofte har innholdsfortegnelsen på slutten av filen, så det er vanskelig å strømpakke den ut.
En alternativ løsning er å se om du kan få et annet filformat, som .tar.gz
.
Hvis du for eksempel laster ned en .zip
-fil fra GitHub, er det nesten alltid en .tar.gz
versjon tilgjengelig.
For eksempel
- 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
Legg merke til mønsteret – bare erstatt .zip
med .tar.gz
og rør til | tar xzf -
Svar
Dette fungerer ganske bra for meg:
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 -