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.
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
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-
Pokud máte nainstalovaný JDK, můžete použít jar
:
wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
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.
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í:
tar.gz
),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 -
.
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]"
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 -