it-swarm-eu.dev

Jak přesměrovat výstup wgetu jako vstup do rozbalení?

Musím stáhnout soubor z tohoto link . Stažení souboru je soubor ZIP, který budu muset rozbalit v aktuální složce.

Normálně bych si ji nejprve stáhl a poté spustil příkaz unzip.

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

Ale tímto způsobem musím provést dva příkazy, počkat na dokončení prvního, abych provedl další, také musím znát název souboru temp.Zip, abyste ji dali unzip.

Je možné přesměrovat výstup z wget na unzip? Něco jako

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

Ale nefungovalo to.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.Zip: nejednoznačné přesměrování

Také wget byl dvakrát spuštěn a soubor stažen dvakrát.

142
Andrew-Dufresne

Soubory musíte stáhnout do dočasného souboru, protože (s citací na rozbalovací stránce man):

Archivy načtené ze standardního vstupu zatím nejsou podporovány, s výjimkou funzipu (a poté lze extrahovat pouze prvního člena archivu).

Stačí spojit příkazy:

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

Ale aby byla flexibilnější, měli byste ji pravděpodobně vložit do skriptu, abyste ušetřili nějaké psaní a abyste se ujistili, že náhodou nepřepisujete něco, můžete pomocí příkazu mktemp vytvořit bezpečný název souboru pro váš dočasný soubor:

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

Toto je pokání moje odpověď k podobné otázce:

Formát souboru Zip obsahuje na konci archivu adresář (index). Tento adresář říká, kde je v archivu umístěn každý soubor, a umožňuje tak rychlý a náhodný přístup bez čtení celého archivu.

Zdálo by se, že to představuje problém, když se pokoušíte číst archiv ZIP prostřednictvím potrubí, protože index není přístupný až do samého konce, takže jednotlivé členy nelze správně extrahovat, dokud není soubor úplně přečten a není již k dispozici. . Zdá se proto nepřekvapivé, že většina dekompresorů Zip prostě selže, když je archív dodán potrubím.

Adresář na konci archivu není pouze místo, kde jsou v archivu uloženy meta informace o souboru. Jednotlivé položky navíc obsahují tyto informace v záhlaví lokálního souboru pro účely redundance.

Ačkoli ne každý dekompresor Zip použije místní záhlaví souborů, když index není dostupný, front dehtu a cpio končí libarchivem (aka bsdtar a bsdcpio) může a bude udělejte to při čtení potrubím, což znamená, že je možné následující:

wget -qO- http://example.org/file.Zip | bsdtar -xvf-
84
ruario

Pokud máte nainstalovaný JDK, můžete použít jar:

wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
22
Rory Hunter

Nemyslím si, že byste dokonce chtěli obtěžovat potrubí wgetů do rozepnutí.

Z wikipedie "Zip (formát souboru)" článek:

Soubor ZIP je identifikován přítomností centrálního adresáře umístěného na konci souboru.

wget musí kompletně dokončit stahování, než unzip může dělat jakoukoli práci, takže běží sekvenčně, nikoli protkané, jak si člověk může myslet.

15
Bruce Ediger

Správná syntaxe by byla:

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

ale nebude to fungovat, kvůli chybě ( Info-Zip on 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.

nebo na BSD/OS X:

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

Důvodem je, že standardní nástroje Zip používají hlavně funkce lseek , aby se na konci nastavil offset souboru, aby se přečetl jeho konec záznamu centrálního adresáře. Je umístěn na konci struktury archivu a je nutné si přečíst seznam souborů (viz: Struktura formátu souboru ZIP ). Soubor proto nemůže být FIFO, potrubí, terminálové zařízení ani žádná jiná dynamika, protože vstupní objekt nelze umístit funkcí lseek.

Máte tedy následující řešení:

  • použít jiný druh komprese (např. tar.gz),
  • musíte použít dva samostatné příkazy,
  • používat alternativní nástroje (jak je navrhováno v jiných odpovědích),
  • vytvořit alias nebo funkci pro použití více příkazů.
11
kenorb

Odpověď moje odpověď :

unzip od BusyBoxu může zabrat stdin a extrahovat všechny soubory.

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

Pomlčka za unzip je použít jako vstup stdin.

Můžete dokonce,

cat file.Zip | busybox unzip -

Ale to je jen zbytečné unzip file.Zip.

Pokud vaše distro ve výchozím nastavení používá BusyBox (např. Alpine), stačí spustit unzip -.

11
Saftever

Pokud je v Zipu pouze jeden soubor, můžete použít zcat nebo gunzip:

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

FYI: Zde jsou definice gunzip a zcat v mém systému:

$ grep ^exec $(which gunzip zcat)
/bin/gunzip:exec gzip -d "[email protected]"
/bin/zcat:exec gzip -cd "[email protected]"
0
SebMa

Archiv Zip není sekvenční (protože může mít obsah na konci souboru), takže je obtížné jej rozbalit. Zkuste zjistit, zda můžete získat jiný formát souboru, například .tar.gz.

Pokud stahujete .Zip soubor z GitHubu, téměř vždy existuje .tar.gz verze k dispozici.

Například,

Všimněte si vzoru? Stačí nahradit .Zip s .tar.gz a dejte potrubí | tar xzf -

0
rustyx