Hvordan omdirigere output av wget som input for å pakke ut?

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 som wget 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 til bsdtar, blir eksekveringsbitene kastet. Når jeg laster ned til disk og trekker ut med bsdtar eller unzip, 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 for unzip; Dessverre jar 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 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

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 -  

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *