it-swarm-id.com

Bagaimana cara mengarahkan output wget sebagai input ke unzip?

Saya harus mengunduh file dari ini tautan . Unduhan file adalah file Zip yang harus saya unzip di folder saat ini.

Biasanya, saya akan mengunduhnya terlebih dahulu, kemudian jalankan perintah unzip.

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

Tetapi dengan cara ini, saya perlu menjalankan dua perintah, menunggu penyelesaian yang pertama untuk mengeksekusi yang berikutnya, juga, saya harus tahu nama file temp.Zip untuk memberikannya kepada unzip.

Apakah mungkin untuk mengarahkan ulang output wget ke unzip? Sesuatu seperti

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

Tapi itu tidak berhasil.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.Zip: pengalihan ambigu

Juga, wget dijalankan dua kali, dan mengunduh file dua kali.

142
Andrew-Dufresne

Anda harus mengunduh file ke file temp, karena (mengutip halaman unzip man):

Arsip yang dibaca dari input standar belum didukung, kecuali dengan funzip (dan kemudian hanya anggota arsip pertama yang dapat diekstraksi).

Satukan saja perintah-perintahnya:

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

Tetapi untuk membuatnya lebih fleksibel Anda mungkin harus memasukkannya ke dalam skrip sehingga Anda menghemat pengetikan dan untuk memastikan Anda tidak secara tidak sengaja menimpa sesuatu Anda bisa menggunakan perintah mktemp untuk membuat nama file yang aman untuk file temp Anda:

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

Ini adalah repost dari jawaban saya untuk pertanyaan serupa:

Format file Zip termasuk direktori (indeks) di akhir arsip. Direktori ini mengatakan di mana, di dalam arsip setiap file berada dan dengan demikian memungkinkan untuk akses cepat dan acak, tanpa membaca seluruh arsip.

Ini akan muncul untuk menimbulkan masalah ketika mencoba membaca arsip Zip melalui pipa, di mana indeks tidak diakses sampai akhir sehingga anggota individu tidak dapat diekstraksi dengan benar sampai setelah file telah sepenuhnya dibaca dan tidak lagi tersedia . Dengan demikian tampaknya tidak mengejutkan bahwa sebagian besar dekompresor Zip gagal ketika arsip dipasok melalui pipa.

Direktori di akhir arsip bukan hanya lokasi tempat informasi meta file disimpan dalam arsip. Selain itu, setiap entri juga menyertakan informasi ini dalam header file lokal, untuk tujuan redundansi.

Meskipun tidak setiap dekompresor Zip akan menggunakan header file lokal ketika indeks tidak tersedia, tar dan cpio depan berakhir menjadi libarchive (alias bsdtar dan bsdcpio) dapat dan akan melakukannya ketika membaca melalui pipa, artinya hal berikut mungkin terjadi:

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

Jika Anda menginstal JDK, Anda dapat menggunakan jar:

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

Saya tidak berpikir Anda bahkan ingin repot-repot menyalurkan output wget ke unzip.

Dari wikipedia "Zip (format file)" artikel:

File Zip diidentifikasi oleh keberadaan direktori pusat yang terletak di akhir file.

wget harus sepenuhnya menyelesaikan unduhan sebelum unzip dapat melakukan pekerjaan apa pun, sehingga mereka berjalan secara berurutan, tidak terjalin seperti yang mungkin dipikirkan orang.

15
Bruce Ediger

Sintaks yang tepat adalah:

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

tetapi tidak akan berfungsi, karena kesalahan ( Info-Zip pada 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.

atau pada BSD/OS X:

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

Ini karena alat Zip standar biasanya menggunakan fungsi lseek untuk mengatur offset file di akhir untuk membaca ujung pusat catatan direktori . Itu terletak di akhir struktur arsip dan diharuskan membaca daftar file (lihat: struktur format file Zip ). Oleh karena itu file tidak boleh FIFO, pipa, perangkat terminal atau dinamika lainnya, karena objek input tidak dapat diposisikan oleh fungsi lseek.

Jadi, Anda memiliki solusi berikut:

  • menggunakan berbagai jenis kompresi (mis. tar.gz),
  • anda harus menggunakan dua perintah terpisah,
  • gunakan alat alternatif (seperti yang disarankan dalam jawaban lain),
  • buat alias atau fungsi untuk menggunakan banyak perintah.
11
kenorb

Repost jawaban saya :

BusyBox unzip dapat mengambil stdin dan mengekstrak semua file.

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

Tanda hubung setelah unzip adalah menggunakan stdin sebagai input.

Anda bahkan bisa,

cat file.Zip | busybox unzip -

Tapi itu hanya mubazir unzip file.Zip.

Jika distro Anda menggunakan BusyBox secara default (mis. Alpine), jalankan unzip -.

11
Saftever

Jika hanya ada satu file di Zip, Anda dapat menggunakan zcat atau gunzip:

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

FYI: Berikut adalah definisi gunzip dan zcat di sistem saya:

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

Arsip Zip tidak berurutan (karena dapat memiliki daftar isi di akhir file) sehingga sulit untuk melakukan stream-unzip. Coba lihat apakah Anda bisa mendapatkan format file lain, seperti .tar.gz.

Jika Anda mengunduh .Zip file dari GitHub, hampir selalu ada .tar.gz versi tersedia.

Sebagai contoh,

Perhatikan polanya? Ganti saja .Zip dengan .tar.gz dan pipa ke | tar xzf -

0
rustyx