Kuinka uudelleenohjata wget-tulos tulona purettavaksi?

Minun on ladattava tiedosto tästä -linkistä . Tiedoston lataus on zip-tiedosto, jonka minun on purettava nykyisessä kansiossa.

Normaalisti lataisin sen ensin ja suoritin sitten pura-komennon.

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

Mutta tällä tavalla minun on suoritettava kaksi komentoa, odotettava ensimmäisen suorittamista seuraavan suorittamiseksi, ja minun on myös tiedettävä tiedoston nimi temp.zip antaa sille unzip.

Voiko wget -lähdön uudelleenohjata div id = ”700ba6affc”>

? Jotain sellaista kuin

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

Mutta se ei toiminut.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip: epäselvä uudelleenohjaus

Myös wget suoritettiin kahdesti ja ladasi tiedoston kahdesti.

Kommentit

  • Jälkimmäisessä esimerkissä wget suoritettiin todennäköisesti kahdesti, koska? on kuoren erikoismerkki URL-osoitteen asettaminen ” ” s: iin pitäisi auttaa.
  • Tällä ketjulla näyttää olevan ratkaisu. Haven ’ ei kokeillut sitä itse. serverfault.com/questions/26474/…

Vastaa

Sinun on ladattava tiedostosi temp-tiedostoon, koska (lainaa purettua man sivu):

Vakiotulosta luettuja arkistoja ei vielä tueta, paitsi funzipillä (ja sitten vain ensimmäiset m Arkiston ihminen voidaan purkaa).

Tuo komennot vain yhteen:

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

Mutta joustavuuden lisäämiseksi sinun on todennäköisesti laitettava se komentosarjaan, jotta säästät kirjoittamista ja varmistaaksesi, ettet vahingossa korvaa jotain, jota voit käyttää mktemp -komento turvallisen tiedostonimen luomiseksi temp-tiedostollesi:

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

kommentit

  • on wget file.zip && unzip file.zip sama kuin wget file.zip; unzip file.zip vai onko toinen mieluummin kuin toinen? Kiitos 🙂
  • @NextLocal wget && unzip puretaan vain, jos wget onnistui. wget ; unzip suoritetaan joka tapauksessa purettu purkaminen, mahdollisesti osoittamalla olemassa olevaan tiedostoon.
  • funzip oli vastaus, jota etsin. Terraform (jostain syystä) pakkaa sen ’ binaarin yhtenä tiedostona zip-arkistoon, joten tämä oli täydellinen minulle.

Vastaa

Tämä on vastaukseni uudelleenlähetys samankaltaiseen kysymykseen:

ZIP-tiedostomuoto sisältää hakemiston (hakemisto) arkiston lopussa. Tämä hakemisto kertoo, missä arkistossa kukin tiedosto sijaitsee, ja mahdollistaa siten nopean, satunnaisen pääsyn lukematta koko arkistoa.

Tämä näyttäisi aiheuttavan ongelman, kun yritetään lukea ZIP-arkistoa putki, koska hakemistoon pääsee vasta loppuun asti, joten yksittäisiä jäseniä ei voida purkaa oikein ennen kuin tiedosto on kokonaan luettu eikä niitä enää ole saatavilla. Sellaisena ei vaikuta yllättävältä, että useimmat ZIP-dekompressorit epäonnistuvat yksinkertaisesti, kun arkisto toimitetaan putken kautta.

Arkiston lopussa oleva hakemisto ei ole ainoa paikka, jossa tiedoston meta tiedot tallennetaan arkistoon. Lisäksi yksittäiset merkinnät sisältävät nämä tiedot myös paikallisen tiedoston otsikossa redundanssia varten.

Vaikka kaikki ZIP-dekompressorit eivät käytä paikallisia tiedostotunnisteita, kun hakemisto ei ole käytettävissä, tar- ja cpio-etupäät libarchiveen (alias bsdtar ja bsdcpio) voivat ja tekevät , kun lukeminen putken läpi, mikä tarkoittaa, että seuraava on mahdollista:

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

kommentit

  • Tämä on erinomaista ! Huomaan, että terva antaa minulle varoituksia pakkaamattomien tietojen väärästä koosta (odotettavissa 0), mutta itse tiedostot näyttävät olevan vahingoittumattomia. Arvaus johtuu hakemiston puuttumisesta.
  • Minulla on täällä .zip -tiedosto, joka sisältää tiedostoja, joilla on suoritettavat oikeudet. Kun lataan ja lähetän levyn bsdtar -sarjaan, exec-bitit heitetään pois. Kun lataan levylle ja puran tiedoston bsdtar tai unzip, exec-bitit kunnioitetaan.
  • // , @GolarRamblar, saitko koskaan tietää miksi?
  • @NathanBasanese: täällä on vastaus. Lyhyesti sanottuna: ZIP-arkistossa on kaksi paikkaa, johon se tallentaa tällaisia tietoja, jotka voivat olla epäjohdonmukaisia, ja riippuen siitä, onko tiedosto bsdtar avattava, haetaan vai ei, se käyttää yhtä tai toista paikkaa .

vastaus

Jos JDK on asennettu, voit käyttää jar:

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

kommentit

  • Huomasin juuri, että jar ei säilytä ’ t tiedostojen käyttöoikeuksia. Hieno temppu muuten.
  • Sinun ’ ei tarvitse antaa tiedoston param-parametria, käytä vain | jar xv
  • Minäkin oletus puri minua, koska jar voitiin käyttää korvaamaan unzip; Valitettavasti jar ei palauta purettuja tiedostoja ’;
  • Käytä vain | jar x
  • jar on paljon mukavampaa käsitellä UTF-8-tiedostonimiä. unzip sekoittanut asioita.

Vastaa

En ”t” luulet, että haluat jopa häiritä wget-lähdön purkamista purettavaksi.

Wikipedia ”ZIP (tiedostomuoto)” -artikkelista:

ZIP-tiedosto tunnistetaan tiedoston lopussa olevan keskihakemiston avulla.

wgetin on suoritettava lataus kokonaan loppuun, ennen kuin purkaminen voi tehdä mitään työtä, joten ne suoritetaan peräkkäin, eivät ole kietoutuneet yhteen, kuten luulisi.

Vastaa

vastaukseni uudelleenlähetys:

BusyBox ”s unzip voi ottaa stdinin ja purkaa kaikki tiedostot.

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

unzip -viivan jälkeen on käytettävä stdiniä syötteenä.

Voit jopa,

cat file.zip | busybox unzip - 

Mutta se on vain tarpeeton unzip file.zip.

Jos distroosi käyttää BusyBoa x oletuksena (esim. Alpine), suorita vain unzip -.

Kommentit

  • edelleen osoitteeseen @Saftever ’ vastauksen, jota en ’ en saa kommentoida, busybox toimii, mutta versiot 1.27.0 vanhemmat voittivat ’ t turhan lseekin takia, katso changelog busybox.net

Vastaa

Oikea syntaksin muoto olisi:

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

mutta se ei toimi virheen takia ( 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. 

tai BSD / OS X: ssä:

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

Tämä johtuu siitä, että tavalliset zip-työkalut käyttävät pääasiassa lseek toiminto , jotta tiedoston siirtymä asetetaan lukemaan sen keskihakemistotietueen loppu . Se sijaitsee arkistorakenteen lopussa ja sitä vaaditaan lukemaan luettelo tiedostoista (katso: Zip-tiedostomuodorakenne ). Siksi tiedosto ei voi olla FIFO, putki, päätelaite tai muu dynaaminen, koska syöttöobjektia ei voida sijoittaa funktiolla lseek.

Joten sinulla on seuraavat kiertotavat:

  • käytä erilaista pakkausta (esim. tar.gz),
  • sinun on käytettävä kahta erillistä komentoa,
  • käytä vaihtoehtoisia työkaluja (kuten muissa vastauksissa ehdotetaan),
  • luo aliaksia tai toimintoja useiden komentojen käyttämiseen.

kommentit

  • Mielestäni se voi silti olla FIFO. ’ Sinun on vain jatkettava lukemista FIFO: sta EOF: ään (koko FIFOn puskurointi käytännössä muistissa tai väliaikaisessa tiedostossa). Täysin toteutettavissa komentosarjojen luomisen helpottamiseksi, mutta ei kovin hyödyllinen.

Vastaa

Jos tiedostossa on vain yksi tiedosto zip, voit käyttää zcat tai gunzip:

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

FYI: Tässä ovat määritelmät järjestelmästäni gunzip ja zcat:

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

vastaus

zip -arkisto ei ole peräkkäinen, koska siinä on usein sisällysluettelo tiedoston lopussa, joten sen purkaminen ja purkaminen on vaikeaa.

Vaihtoehtoinen ratkaisu on selvittää, saatko toisen tiedostomuodon, kuten .tar.gz.

Jos esimerkiksi lataat .zip -tiedoston GitHubista, siellä on melkein aina .tar.gz versio saatavilla.

Esimerkiksi

Huomaa malli – korvaa vain .zip sanalla .tar.gz ja putki kohtaan | tar xzf -

Vastaa

Tämä toimii minulle melko hyvin:

 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 -  

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *