Musím si stáhnout soubor z tohoto odkazu . Stahování souboru je soubor zip, který budu muset rozbalit v aktuální složce.
Normálně bych si ho nejprve stáhl a potom 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 a provést další, také musím znát název souboru temp.zip
dát to unzip
.
Je možné přesměrovat výstup 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 proveden dvakrát a soubor stáhli dvakrát.
Komentáře
- V druhém příkladu byl wget pravděpodobně proveden dvakrát, protože? je speciální znak v prostředí . Vložení adresy URL do “ “ s by mělo pomoci.
- Zdá se, že toto vlákno má řešení. Haven ‚ Nezkoušel jsem to však sám. serverfault.com/questions/26474/…
Odpověď
Soubory si musíte stáhnout do dočasného souboru, protože (cituji rozbalení manuálová stránka):
Archivy načtené ze standardního vstupu zatím nejsou podporovány, kromě funzipu (a poté pouze prvního m číslo archivu lze extrahovat).
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 si ušetřili nějaké psaní a abyste se ujistili, že omylem něco nepřepíšete, můžete použít mktemp
příkaz k vytvoření bezpečného názvu souboru pro váš dočasný soubor:
#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE
Komentáře
- Je
wget file.zip && unzip file.zip
stejné jakowget file.zip; unzip file.zip
nebo je upřednostňováno jedno před druhým? Děkujeme 🙂 - @NextLocal
wget && unzip
se rozbalí, pouze pokud bude wget úspěšný.wget ; unzip
bude stejně spuštěn unzip, možná bude ukazovat na neexistující soubor. - Funzip byla odpověď, kterou jsem hledal. Terraform (z nějakého důvodu) balí ‚ s binární soubor jako jeden soubor v archivu zip, takže to pro mě bylo perfektní.
Odpovědět
Toto je ukázka mé odpovědi na podobnou otázku:
Formát souboru ZIP obsahuje adresář (index) na konci archivu. Tento adresář uvádí, kde se v archivu nachází každý soubor, a umožňuje tak rychlý a náhodný přístup bez čtení celého archivu.
Zdá se, že to představuje problém při pokusu o čtení archivu ZIP prostřednictvím pipe, v tom, že k indexu není přistupováno až do samého konce, a proto nelze jednotlivé členy správně extrahovat, dokud nebude soubor zcela přečten a již nebude k dispozici. Zdá se tedy nepřekvapující, že většina ZIP dekompresorů jednoduše selže, když je archiv dodáván potrubím.
Adresář na konci archivu není jediným umístěním, kde je soubor meta informace jsou uloženy v archivu. Jednotlivé položky navíc obsahují tyto informace také v hlavičce lokálního souboru pro účely redundance.
Ačkoli ne každý dekompresor ZIP bude používat místní záhlaví souborů, když index není k dispozici, tar a cpio frontendy libarchivu (aka bsdtar a bsdcpio) mohou a budou tak činit, když čtení potrubím, což znamená, že je možné následující:
wget -qO- http://example.org/file.zip | bsdtar -xvf-
Komentáře
- To je vynikající ! Všiml bych si, že tar mi dává několik varování o tom, že nekomprimovaná data mají nesprávnou velikost (očekávaná 0), ale samotné soubory se zdají být nepoškozené. Hádám, že je to kvůli nedostatku indexu.
- Mám zde soubor
.zip
, který obsahuje soubory se spustitelnými oprávněními. Když stáhnu a připojím dobsdtar
, jsou bitové soubory vyhodeny. Když stáhnu na disk a extrahuji pomocíbsdtar
nebounzip
, jsou bitové soubory ctěny. - // , @GolarRamblar, zjistil jsi někdy proč?
- @NathanBasanese: zde je odpověď. Stručně řečeno: ZIP archiv má dvě místa, kde ukládá takové informace, které mohou být nekonzistentní, a podle toho, zda je soubor
bsdtar
otevřen, je viditelný nebo ne, používá jedno nebo druhé místo .
Odpověď
Pokud máte nainstalovaný JDK, můžete použít jar
:
wget -qO- http://example.org/file.zip | jar xvf /dev/stdin
Komentáře
- Právě jsem zjistil, že
jar
nezachová ‚ oprávnění souboru. Jinak pěkný trik. - Nemusíte ‚ dávat parametr souboru, stačí použít
| jar xv
- I já jsem byl pokousán předpokladem, že
jar
lze použít jako náhradu zaunzip
;jar
bohužel neobnoví extrahované soubory ‚ oprávnění; - stačí použít
| jar x
-
jar
je mnohem hezčí zacházení s názvy souborů UTF-8.unzip
rozbité věci.
Odpověď
Nebudu myslíte si, že dokonce chcete obtěžovat pipetování výstupu wgetu do unzipu.
Z článku wikipedia „ZIP (formát souboru)“ :
Soubor ZIP je identifikován přítomností centrálního adresáře umístěného na konci souboru.
wget musí úplně dokončit stahování, než unzip může dělat jakoukoli práci, takže běží postupně, ne protkané, jak by si někdo myslel.
Odpovědět
Repost of moje odpověď :
BusyBox „s unzip
může použít stdin a extrahovat všechny soubory.
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -
Pomlčka za unzip
má použít stdin jako vstup.
Můžete dokonce,
cat file.zip | busybox unzip -
Ale to je nadbytečné z unzip file.zip
.
Pokud vaše distribuce používá BusyBo x ve výchozím nastavení (např. Alpine), stačí spustit unzip -
.
Komentáře
- dále k @Saftever ‚ s odpovědí, ke které nemůžu ‚ přidávat komentáře, busybox bude fungovat, ale verze starší než 1.27.0 vyhrají ‚ kvůli nadbytečnému vyhledávání, viz seznam změn busybox.net
odpověď
Správná syntaxe by byla:
$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)
, ale kvůli chybě (to nebude fungovat) ( Info-ZIP na 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
Je tomu tak proto, že standardní nástroje pro zip používají hlavně lseek
funkce za účelem nastavení odsazení souboru na konci, 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é číst seznam souborů (viz: Struktura formátu souboru ZIP ). Soubor proto nemůže být FIFO, roura, koncové zařízení ani žádná jiná dynamika, protože vstupní objekt nelze umístit pomocí funkce lseek
.
Takže máte následující řešení:
- použít jiný druh komprese (např.
tar.gz
), - musíte použít dva samostatné příkazy,
- použít alternativní nástroje (jak je navrženo v jiných odpovědích),
- vytvořit alias nebo funkci pro použití více příkazů.
Komentáře
- Myslím, že stále by mohl být FIFO. Musíte ‚ prostě číst z FIFO do EOF (účinně ukládat do vyrovnávací paměti celý FIFO v paměti nebo v dočasném souboru). Úplně proveditelné, aby se usnadnilo vytváření skriptů, ale není to příliš užitečné.
Odpověď
Pokud je v souboru pouze jeden soubor zip, můžete použít zcat
nebo gunzip
:
wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip
Pro informaci: Zde jsou definice gunzip
a zcat
v mém systému:
$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@"
Odpověď
Archiv zip
není sekvenční, protože má často obsah na konci souboru, takže je obtížné jej rozbalit streamem.
Alternativním řešením je zjistit, zda můžete získat jiný formát souboru, například .tar.gz
.
Pokud například stahujete .zip
soubor z GitHubu, téměř vždy existuje .tar.gz
verze k dispozici.
Například
- 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
Všimněte si vzoru – stačí nahradit .zip
řetězcem .tar.gz
a přesměrovat na | tar xzf -
Odpověď
To pro mě funguje celkem dobře:
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 -