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 alswget 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 naarbsdtar
pijp, worden de exec-bits weggegooid. Wanneer ik download naar schijf en extraheer metbsdtar
ofunzip
, 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 voorunzip
; Helaas hersteltjar
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
- 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
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 -