Saya harus mengunduh file dari tautan ini . 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 unzip
.
Apakah mungkin untuk mengarahkan 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
dieksekusi dua kali, dan mengunduh file dua kali.
command-line
io-redirection
Andrew-Dufresne
sumber
sumber
Jawaban:
Anda harus mengunduh file ke file temp, karena (mengutip halaman unzip man):
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 menyimpan beberapa pengetikan dan untuk memastikan Anda tidak secara tidak sengaja menimpa sesuatu Anda bisa menggunakan
mktemp
perintah untuk membuat nama file yang aman untuk file temp Anda:sumber
wget file.zip && unzip file.zip
samawget file.zip; unzip file.zip
atau lebih disukai daripada yang lain? Terima kasih :)wget && unzip
akan berjalan unzip hanya jika wget berhasil.wget ; unzip
akan tetap menjalankan unzip, mungkin menunjuk ke file yang tidak ada.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 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 dekompresi ZIP gagal ketika arsip dipasok melalui pipa.
Direktori di akhir arsip bukan satu - satunya lokasi di mana informasi meta file disimpan dalam arsip. Selain itu, setiap entri juga menyertakan informasi ini di 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 ke libarchive (alias bsdtar dan bsdcpio) dapat dan akan melakukannya saat membaca melalui pipa, yang berarti bahwa hal berikut mungkin terjadi:
sumber
.zip
-file di sini yang berisi file dengan izin yang dapat dieksekusi. Ketika saya mengunduh danbsdtar
mengirim pipa ke , bit exec bisa dibuang. Ketika saya mengunduh ke disk dan mengekstrak denganbsdtar
atauunzip
kemudian, bit exec merasa terhormat.bsdtar
dibuka dapat dicari atau tidak, ia menggunakan satu atau tempat lain.Jika Anda menginstal JDK, Anda dapat menggunakan
jar
:sumber
jar
tidak mempertahankan izin file. Trik yang bagus sebaliknya.| jar xv
Saya tidak berpikir Anda bahkan ingin repot-repot menyalurkan output wget ke unzip.
Dari artikel wikipedia "ZIP (format 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.
sumber
Sintaks yang tepat adalah:
tetapi tidak akan berhasil, karena kesalahan ( Info-ZIP di Debian ):
atau pada BSD / OS X:
Ini, karena alat zip standar terutama menggunakan
lseek
fungsi untuk mengatur offset file di akhir untuk membaca akhir dari catatan direktori pusat . 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 olehlseek
fungsi.Jadi, Anda memiliki solusi berikut:
tar.gz
),sumber
Repost jawaban saya :
BusyBox's
unzip
dapat mengambil stdin dan mengekstrak semua file.Tanda hubung
unzip
adalah menggunakan stdin sebagai input.Anda bahkan bisa,
Tapi itu hanya mubazir
unzip file.zip
.Jika distro Anda menggunakan BusyBox secara default (misalnya Alpine), jalankan saja
unzip -
.sumber
Ini bekerja dengan baik untuk saya:
sumber