Hoe kan ik de uitvoer van wget omleiden als invoer om te unzippen?

Ik moet een bestand downloaden van deze link . Het downloaden van het bestand is een zip-bestand dat ik moet uitpakken in de huidige map.

Normaal gesproken zou ik het eerst downloaden en daarna de unzip-opdracht uitvoeren.

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

Maar op deze manier moet ik twee opdrachten uitvoeren, wachten op de voltooiing van de eerste om de volgende uit te voeren, en ik moet ook de naam van het bestand weten temp.zip om het aan unzip te geven.

Is het mogelijk om de uitvoer van wget om te leiden naar unzip? Iets als

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

Maar het werkte niet.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip: ambigue redirect

wget werd ook twee keer uitgevoerd , en het bestand twee keer gedownload.

Opmerkingen

  • In het laatste voorbeeld werd wget waarschijnlijk twee keer uitgevoerd omdat de? een speciaal teken in de shell is . Het plaatsen van de URL in ” ” s zou moeten helpen.
  • Deze thread lijkt een oplossing te hebben. Haven ‘ ik heb het zelf geprobeerd. serverfault.com/questions/26474/…

Answer

Je moet je bestanden downloaden naar een tijdelijk bestand, omdat (onder vermelding van de unzip man-pagina):

Archieven gelezen van standaardinvoer worden nog niet ondersteund, behalve met funzip (en dan alleen de eerste m ember van het archief kan worden uitgepakt).

Breng gewoon de commandos samen:

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

Maar om het flexibeler te maken, zou je het waarschijnlijk in een script moeten stoppen, zodat je wat typen bespaart en om ervoor te zorgen dat je niet per ongeluk iets overschrijft, kun je de mktemp commando om een veilige bestandsnaam voor uw tijdelijke bestand te maken:

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

Reacties

  • Is wget file.zip && unzip file.zip hetzelfde als wget file.zip; unzip file.zip of heeft de ene de voorkeur boven de andere? Bedankt 🙂
  • @NextLocal wget && unzip zal alleen unzip draaien als wget is geslaagd. wget ; unzip zal hoe dan ook unzip uitvoeren, mogelijk verwijzend naar een niet-bestaand bestand.
  • funzip was het antwoord dat ik zocht. Terraform verpakt (om de een of andere reden) het ‘ s binair bestand als een enkel bestand in een zip-archief, dus dit was perfect voor mij.

Antwoord

Dit is een repost van mijn antwoord op een vergelijkbare vraag:

Het ZIP-bestandsformaat bevat een directory (index) aan het einde van het archief. Deze map geeft aan waar, in het archief, elk bestand zich bevindt en maakt dus snelle, willekeurige toegang mogelijk, zonder het hele archief te lezen.

Dit lijkt een probleem te vormen bij het proberen om een ZIP-archief te lezen via een pipe, in die zin dat de index pas op het einde wordt geopend en dat individuele leden pas correct kunnen worden geëxtraheerd nadat het bestand volledig is gelezen en niet langer beschikbaar is. Als zodanig lijkt het niet verwonderlijk dat de meeste ZIP-decompressors gewoon falen wanneer het archief via een pipe wordt aangeleverd.

De directory aan het einde van het archief is niet de enige locatie waar de bestandsmeta informatie wordt opgeslagen in het archief. Bovendien bevatten individuele vermeldingen deze informatie ook in een lokale bestandskop, voor redundantiedoeleinden.

Hoewel niet elke ZIP-decompressor lokale bestandsheaders zal gebruiken wanneer de index niet beschikbaar is, eindigen de tar- en cpio-fronten op libarchive (ook bekend als bsdtar en bsdcpio) kan en zal dit doen wanneer lezen door een pijp, wat betekent dat het volgende mogelijk is:

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

Reacties

  • Dit is uitstekend ! Ik zou opmerken dat tar me enkele waarschuwingen geeft dat de niet-gecomprimeerde gegevens de verkeerde grootte hebben (verwachte 0), maar de bestanden zelf lijken onbeschadigd te zijn. Dit vermoeden is te wijten aan het ontbreken van de index.
  • Ik heb hier een .zip -bestand dat bestanden met uitvoerbare machtigingen bevat. Wanneer ik download en naar bsdtar pijp, worden de exec-bits weggegooid. Wanneer ik download naar schijf en extraheer met bsdtar of unzip, worden de exec-bits gerespecteerd.
  • // , @GolarRamblar, heb je ooit ontdekt waarom?
  • @NathanBasanese: hier is het antwoord. In het kort: een ZIP-archief heeft twee plaatsen waar het dergelijke informatie opslaat, die inconsistent kan zijn, en afhankelijk of het bestand bsdtar wordt geopend, kan het de ene of de andere plaats gebruiken .

Answer

Als je de JDK hebt geïnstalleerd, kun je jar:

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

Reacties

  • Ik heb net ontdekt dat jar behoudt geen ‘ bestandsrechten. Anders een leuke truc.
  • Je hoeft ‘ geen bestandsparameter op te geven, gebruik gewoon | jar xv
  • Ik was ook gebeten door de aanname dat jar gebruikt zou kunnen worden als vervanging voor unzip; Helaas herstelt jar de uitgepakte bestanden niet ‘ rechten;
  • Gebruik gewoon | jar x
  • jar is veel prettiger om met UTF-8-bestandsnamen om te gaan. unzip heeft dingen verminkt.

Antwoord

Ik wil niet denk dat je zelfs de moeite wilt nemen om de uitvoer van wget naar unzip te sturen.

Van het artikel op wikipedia “ZIP (bestandsformaat)” :

Een ZIP-bestand wordt geïdentificeerd door de aanwezigheid van een centrale directory aan het einde van het bestand.

wget moet de download volledig voltooien voordat unzip enig werk kan doen, dus ze draaien opeenvolgend, niet met elkaar verweven zoals je zou denken.

Antwoord

Repost van mijn antwoord :

BusyBox “s unzip kan stdin nemen en alle bestanden extraheren.

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

Het streepje na unzip is om stdin te gebruiken als invoer.

U kunt zelfs,

cat file.zip | busybox unzip - 

Maar dat “is gewoon overbodig van unzip file.zip.

Als je distro BusyBo gebruikt x standaard (bijv. Alpine), voer gewoon unzip - uit.

Reacties

  • verder naar @Saftever ‘ s antwoord, waarop ik ‘ m niet mag reageren, busybox zal werken, maar versies ouder dan 1.27.0 winnen ‘ t vanwege een overtollige lseek, zie changelog busybox.net

Antwoord

De juiste syntaxis zou zijn:

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

maar het zal niet werken vanwege de fout ( Info-ZIP op 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. 

of op BSD / OS X:

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

Dit komt doordat de standaard zip-tools voornamelijk lseek functie om de bestandsoffset aan het einde in te stellen om het einde van de centrale directoryrecord te lezen. Het bevindt zich aan het einde van de archiefstructuur en het is vereist om de lijst te lezen van de bestanden (zie: Zip-bestandsindeling ). Daarom kan het bestand geen FIFO, pipe, terminal device of een andere dynamiek zijn, omdat het invoerobject niet kan worden gepositioneerd door de functie lseek.

Dus je hebt de volgende tijdelijke oplossingen:

  • gebruik verschillende soorten compressie (bijv. tar.gz),
  • je moet twee afzonderlijke commandos gebruiken,
  • alternatieve tools gebruiken (zoals voorgesteld in andere antwoorden),
  • een alias of functie maken om meerdere commandos te gebruiken.

Reacties

  • Ik denk dat het nog steeds kan een FIFO zijn. U ‘ d hoeft alleen maar te blijven lezen van de FIFO tot EOF (in feite buffert de hele FIFO in het geheugen of in een tijdelijk bestand). Volledig te doen om het maken van scripts te vergemakkelijken, maar niet erg handig.

Answer

Als er maar één bestand in zip kun je zcat of gunzip gebruiken:

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

Ter info: hier zijn de definities van gunzip en zcat op mijn systeem:

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

Answer

Een zip archief is niet opeenvolgend omdat het vaak de inhoudsopgave bevat aan het einde van het bestand, dus het is moeilijk om het te streamen en uit te pakken.

Een alternatieve oplossing is om te kijken of je een ander bestandsformaat kunt krijgen, zoals .tar.gz.

Als u bijvoorbeeld “een .zip -bestand downloadt van GitHub, is er bijna altijd een .tar.gz versie beschikbaar.

Bijvoorbeeld

Let op het patroon – vervang gewoon .zip door .tar.gz en leid door naar | tar xzf -

Antwoord

Dit werkt voor mij best goed:

 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 -  

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *