it-swarm-tr.com

Wget çıktısını unzip'e nasıl yönlendirebilirim?

Bundan bir dosya indirmem gerekiyor link . Dosya indirme, geçerli klasörde açmak zorunda kalacak bir Zip dosyasıdır.

Normalde önce indiririm, sonra unzip komutunu çalıştırırdım.

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

Ama bu şekilde, ben iki komut yürütmek gerekir, bir sonraki bir sonraki yürütmek için tamamlanması için bekleyin, ayrıca, unzip vermek için temp.Zip dosyasının adını bilmeliyim .

wget çıktısını unzip 'ya yeniden yönlendirmek mümkün müdür? 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.Zip: belirsiz yönlendirme

Ayrıca, wget iki kez yürütüldü ve dosyayı iki kez indirdi.

142
Andrew-Dufresne

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

Funzip dışında standart girdiden okunan arşivler henüz desteklenmemektedir (ve daha sonra arşivin yalnızca 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 komut dosyasına yerleştirmelisiniz, böylece bazı yazmalardan tasarruf edersiniz ve yanlışlıkla bir şeyin üzerine yazmadığınızdan emin olmak için mktemp komutunu kullanarak güvenli bir dosya adı oluşturabilirsiniz. temp dosyanız için:

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

Bu benzer bir soruya cevabım bir repost.

Zip dosyası biçimi arşivin sonunda bir dizin (dizin) içerir. Bu dizin, arşiv içinde her dosyanın nerede bulunduğunu söyler ve böylece tüm arşivi okumadan hızlı, rastgele erişime izin verir.

Bu, bir kanaldan Zip arşivini okumaya çalışırken bir dizinin sonuna kadar erişilememesi ve dosya tamamen okunana ve artık kullanılamamasına kadar tek tek üyelerin doğru şekilde ayıklanamaması gibi bir sorun teşkil ediyor gibi görünmektedir. . Bu nedenle, çoğu Zip dekompresörünün arşiv bir borudan beslendiğinde başarısız olması şaşırtıcı görünmemektedir.

Arşivin sonundaki dizin, dosya meta bilgilerinin arşivde depolandığı yalnızca konum değildir. Buna ek olarak, tek tek girişler bu bilgileri artıklık amacıyla yerel bir dosya başlığına da ekler.

Her Zip sıkıştırıcısı, dizin kullanılamadığında yerel dosya başlıklarını kullanmasa da, tar ve cpio ön tarafı libarchive'a (aka bsdtar ve bsdcpio) geçebilir ve olacaktır bunu bir borudan okurken yapın, yani aşağıdakiler mümkündür:

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

JDK yüklüyse, jar kullanabilirsiniz:

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

Boru wget'in çıktısını unzip haline getirmek istediğinizi bile sanmıyorum.

Vikipedi "Zip (dosya biçimi)" makalesinden:

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

wget, unzip herhangi bir iş yapmadan önce indirmeyi tamamen bitirmelidir, bu yüzden düşünebileceği gibi iç içe değil sıralı olarak çalışırlar.

15
Bruce Ediger

Doğru sözdizimi şöyle olur:

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

ancak hata nedeniyle çalışmaz (Info-ZiponDebian):

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'te:

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

Bunun nedeni, standart Zip araçlarının temelde lseek function kullanmasıdır; sonunda dosya ofsetinimerkezi dizin kaydının sonu. Arşiv yapısının sonunda bulunur ve dosyaların listesini okumak gerekir (bkz: Zip dosya biçimi yapısı ). Bu nedenle, dosya FIFO, boru, terminal aygıtı veya başka bir dinamik olamaz, çünkü giriş nesnesi lseek işlevi tarafından konumlandırılamaz.

Yani aşağıdaki geçici çözümlere sahipsiniz:

  • farklı sıkıştırma türleri kullanın (ör. tar.gz),
  • iki ayrı komut kullanmalısınız,
  • alternatif araçlar kullanın (diğer cevaplarda önerildiği gibi),
  • birden çok komut kullanmak için bir takma ad veya işlev oluşturun.
11
kenorb

Repost cevabım :

BusyBox'ın unzip stdin alabilir ve tüm dosyaları ayıklayabilir.

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

unzip öğesinden sonraki kısa çizgi stdin'i girdi olarak kullanmaktır.

Hatta,

cat file.Zip | busybox unzip -

Ama bu sadece unzip file.Zip.

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

11
Saftever

Zip'te yalnızca bir dosya varsa zcat veya gunzip kullanabilirsiniz:

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

Bilginize: Sistemimdeki gunzip ve zcat tanımları:

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

Bir Zip arşivi sıralı değildir (dosyanın sonunda içindekiler tablosuna sahip olabileceğinden) akışını açmak zordur. .tar.gz Gibi başka bir dosya biçimi alıp alamayacağınızı görmeye çalışın.

GitHub'dan bir .Zip Dosyası indiriyorsanız, neredeyse her zaman bir .tar.gz Sürümü vardır.

Örneğin,

Deseni fark ettiniz mi? .Zip Yerine .tar.gz Yazıp | tar xzf -

0
rustyx