Wget çıktısını açmak için girdi olarak nasıl yönlendirilir?


131

Bu linkten bir dosya indirmem gerekiyor . Dosya indirme, mevcut klasörde açmam gereken bir zip dosyası.

Normalde ilk önce indirir, sonra da unzip komutunu çalıştırırım.

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

Fakat bu yolla iki komutu yerine getirmem gerekiyor, birincisinin yerine getirilmesi için birincinin tamamlanmasını beklemeliyim, ayrıca temp.zipvereceğim dosyanın adını da bilmeliyim unzip.

O çıktısını yönlendirmek mümkün mü wgetiçin unzip? Gibi bir şey

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

Ama işe yaramadı.

bash:: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zipbelirsiz yönlendirme

Ayrıca, wgetiki kez çalıştırıldı ve dosyayı iki kez indirdi.


İkinci örnekte, wget muhtemelen iki kez yürütüldü çünkü? Kabuktaki özel bir karakterdir. URL’yi "" lerin içine koymak yardımcı olacaktır.
p-static

Bu iş parçacığının bir çözümü var gibi görünüyor. Yine de kendim denemedim. serverfault.com/questions/26474/…

Yanıtlar:


96

Dosyalarınızı geçici bir dosyaya indirmelisiniz, çünkü (unzip man sayfasından alıntı yaparak):

Standart girdiden okunan arşivler funzip dışında henüz desteklenmiyor (ve yalnızca arşivin ilk üyesi çıkarılabilir).

Sadece komutları bir araya getirin:

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

Ancak daha esnek hale getirmek için muhtemelen bir betiğe koymalısınız, bu nedenle bazı mktempyazımları kaydedersiniz ve yanlışlıkla üzerine yazmadığınızdan emin olmak için temp dosyanız için güvenli bir dosya adı oluşturmak için bu komutu kullanabilirsiniz :

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

Biri diğerine nazaran wget file.zip && unzip file.zipaynı mı wget file.zip; unzip file.zipyoksa tercih edilen mi? Thanks :)
jaggedsoft

7
@NextLocal wget && unzip, yalnızca wget başarılı olursa sıkıştırılmış dosyayı açacaktır. wget ; unzipZaten unzip çalıştıracak, muhtemelen varolmayan dosyaya işaret edecek.
temoto

funzip aradığım cevaptı. Terraform (nedense), bir zip arşivindeki tek bir dosya olarak ikili paketlendiğinden, bu benim için mükemmeldi.
Asfand Qazi

74

Bu, benzer bir soruya verdiğim cevabın bir kopyası :

ZIP dosya formatı arşivin sonunda bir dizin (dizin) içerir. Bu dizin, arşiv içindeki her dosyanın nerede bulunduğunu ve böylece arşivin tamamını okumadan hızlı, rasgele erişime izin verdiğini söyler.

Bir borudan bir ZIP arşivi okumaya çalışırken, indekse sonuna kadar erişilemediğinden ve bireysel üyeler dosya tamamen okunana ve artık bulunamayana kadar doğru şekilde ayıklanamadığı için bir problem ortaya çıkıyor gibi görünmektedir. . Bu nedenle, çoğu ZIP dekompresörünün, arşiv bir borudan beslendiğinde kolayca başarısız olması şaşırtıcı değildir.

Arşivin sonundaki dizin, meta bilgilerinin arşivde depolandığı tek yer değil . Ek olarak, bireysel girişler bu bilgiyi fazlalık amacıyla yerel bir dosya başlığında da içerir.

Her ZIP sıkıştırıcısı, dizin kullanılamadığında yerel dosya başlıklarını kullanmasa da, katran ve cpio önü libarchive (aka bsdtar ve bsdcpio) bir borudan okurken bunu yapabilir ve yapacaktır :

wget -qO- http://example.org/file.zip | bsdtar -xvf-

1
Bu mükemmel! Tar'ın bana sıkıştırılmamış veriler hakkında yanlış boyutta olduğu konusunda bazı uyarılar verdiğini hatırlıyorum (beklenen 0), ancak dosyaların zarar görmemiş oldukları görülüyor. Bunun tahmin edilmesi endeksin eksikliğinden kaynaklanıyor.
Wyatt8740

1
Bir var .zipyürütülebilir izinlerle dosyaları içeren buraya -File. Dosyayı indirdiğimde ve bsdtaraktardığımda, yürütme bitleri atılıyor. Diske indirdiğimde bsdtarveya unzipsonra çıkardığımda exec bitleri onurlandırılıyor.
Golar Ramblar

//, @GolarRamblar, nedenini hiç bulamadınız mı?
Nathan Basanese

1
@NathanBasanese: İşte cevap. Kısacası: Bir ZIP arşivi, bu tür bilgileri sakladığı, tutarsız olabilecek ve dosyanın bsdtaraçılıp açılmadığına bağlı olarak , bir tanesini veya diğerini kullanıp kullanmadığına bağlı olarak iki yere sahiptir.
Golar Ramblar 11:18

20

JDK'yı yüklediyseniz, şunları kullanabilirsiniz jar:

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin

3
Bunun sadece jardosya izinlerini korumadığını buldum . Aksi takdirde güzel hile.
phunehehe

7
Bir dosya param vermek gerekmez, sadece kullanın| jar xv
cricket_007

15

Wget'in çıktısını açıp kapamak için bile uğraşmak istediğinizi sanmıyorum.

Wikipedia itibaren "Posta (dosya biçimi)" makalesinde:

Bir ZIP dosyası, dosyanın sonunda bulunan merkezi bir dizinin varlığı ile tanımlanır.

wget, unzip herhangi bir işi yapmadan önce indirmeyi tamamen bitirmek zorundadır;


10

Uygun sözdizimi şöyle olur:

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

ama bunun nedeni hata (bir işe yaramaz Info-Posta üzerine 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.

veya BSD / OS X’de:

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

Bunun nedeni, standart zip araçlarının temel olarak sonunda dosya merkezini merkez dizin kaydının sonunu okumak üzere ofsetini ayarlamak için lseekişlev kullanmasıdır . Arşiv yapısının sonunda bulunur ve dosyaların listesini okumak gerekir (bkz: Zip dosyası formatı yapısı ). Bu nedenle, dosya FIFO, boru, terminal cihazı veya başka herhangi bir dinamik olamaz, çünkü giriş nesnesi işlev tarafından konumlandırılamaz .lseek

Bu nedenle, aşağıdaki geçici çözümlere sahipsiniz:

  • farklı sıkıştırma türleri kullanmak (örn. tar.gz),
  • iki ayrı komut kullanmanız gerekir,
  • alternatif araçlar kullanmak (diğer cevaplarda önerildiği gibi),
  • Birden çok komut kullanmak için bir takma ad veya işlev oluşturun.

Hala bir FIFO olabileceğini düşünüyorum . Sadece FIFO’dan EOF’a kadar okumaya devam etmelisiniz (tüm FIFO’yu bellekte veya geçici bir dosyada etkin bir şekilde tamponlayın). Tamamen komut dosyası oluşturma işlemini kolaylaştırır, ancak çok kullanışlı değildir.
Evan Carroll,

8

Cevabımın tekrarı :

BusyBox unzip, stdin'i alabilir ve tüm dosyaları çıkarabilir.

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

Sonrasındaki çizgi unzip, stdin'i giriş olarak kullanmaktır.

Yapabilirsin

cat file.zip | busybox unzip -

Ama bu sadece gereksiz unzip file.zip.

Dağıtımınız varsayılan olarak BusyBox kullanıyorsa (örn. Alpine), sadece çalıştırın unzip -.


Çok faydalı bir numara, teşekkürler!
Brice

-1

Bu benim için oldukça iyi çalışıyor:

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 -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.