Jak přesměrovat výstup z wget jako vstup do rozbalit?

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é jako wget 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 do bsdtar, jsou bitové soubory vyhodeny. Když stáhnu na disk a extrahuji pomocí bsdtar nebo unzip, 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 za unzip; 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

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 -  

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *