Bisakah saya membuat unzip atau program serupa bekerja pada output standar? Situasi saya sedang mengunduh file zip, yang seharusnya membuka ritsleting dengan cepat.
Masalah terkait: Bagaimana cara menyalurkan file yang diunduh ke output standar dalam bash?
linux
ubuntu
pipe
compression
Alex
sumber
sumber
Jawaban:
Walaupun file zip sebenarnya adalah format kontainer, tidak ada alasan mengapa itu tidak dapat dibaca dari sebuah pipa (stdin) jika file tersebut dapat masuk ke dalam memori dengan cukup mudah. Berikut skrip Python yang mengambil file zip sebagai input standar dan mengekstraksi konten ke direktori saat ini atau ke direktori yang ditentukan jika ditentukan.
Script ini dapat diperkecil menjadi satu baris dan dibuat sebagai alias.
Sekarang unzip output wget dengan mudah.
sumber
.read()
metodeIni tidak mungkin berhasil seperti yang Anda harapkan. Zip bukan hanya format kompresi, tetapi juga format wadah. Ini menggulung pekerjaan tar dan gzip.bzip2 menjadi satu. Karena itu, jika zip Anda memiliki satu file, Anda dapat menggunakan unzip -p untuk mengekstrak file ke stdout. Jika Anda memiliki lebih dari satu file, tidak ada cara bagi Anda untuk mengetahui di mana mereka mulai dan berhenti.
Sedangkan untuk membaca dari stdin, halaman manual unzip memiliki kalimat ini:
Anda mungkin beruntung dengan funzip.
sumber
Apa yang ingin Anda lakukan adalah, membuat
unzip
mengambil file ZIP pada input standar dan bukan sebagai argumen. Ini biasanya mudah didukung olehgzip
dantar
jenis alat dengan-
argumen. Tetapi standarunzip
tidak melakukan itu (meskipun, itu mendukung ekstraksi ke pipa). Namun, semuanya tidak hilang ...Lihat halaman manual funzip .
Ini berjalan baik dengan gagasan bahwa sebagian besar arsip linux biasanya TAR'ed dan kemudian ZIP dalam beberapa cara (gzip, bzip, et al). Ini akan bekerja untuk Anda jika Anda punya
tar.ZIP
.Perlu dicatat bahwa
funzip
ini ditulis oleh penulis asli Info-ZIP Mark Adler. Dia menulis di halaman manual funzip,Namun, tidak ada pembaruan seperti itu terlihat di sekitar. Saya menduga bahwa Markus merasa tidak perlu karena metode pengarsipan lainnya bekerja dengan mudah dengan TAR.
sumber
Saya suka menggunakan curl karena diinstal secara default (
-L
diperlukan untuk pengalihan yang sering terjadi):Namun,
bsdtar
tidak diinstal secara default, dan saya tidak bisa mulaifunzip
bekerja.sumber
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
Tidak mungkin dengan Info-Zip yang merupakan implementasi OSS paling umum. Lebih penting lagi, itu tidak direkomendasikan karena konstruksi arsip ZIP.
Jika perubahan format dapat dilakukan untuk Anda, maka pertimbangkan untuk menggunakan tar (1). Cukup senang dengan input / output yang dialirkan dan, pada kenyataannya, mengharapkannya secara default.
Selain itu, Anda sering dapat mengetahui apakah aplikasi mengharapkan input / output yang dialirkan dengan menentukan "-" untuk nama file. Info-Zip, seperti yang dapat Anda bayangkan, tidak memperlakukan ini sebagai argumen yang valid.
sumber
Di zsh, Anda dapat melakukan hal berikut:
sumber
Utilitas umum paling sederhana yang tersedia yang akan melakukan ini adalah
jar
, yang akan menganggap STDIN sedang digunakan jika Anda tidak memberikan file args. Itu juga membutuhkan argumen yang mirip dengantar
program untuk operasi.misal, daftar isi arsip
curl https://my.example.com/file.zip | jar t
Walaupun Java tidak selalu terinstal, pada mesin-mesin di mana ia berada,
jar
jelas merupakan metode yang paling nyaman untuk melakukan ini.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
Saya benar-benar membutuhkan sesuatu yang sedikit lebih rumit - mengekstrak file tertentu jika ada. Kesulitannya, aliran file input mungkin bukan file zip, dan dalam hal ini, saya membutuhkannya untuk melanjutkan melalui pipa. Inilah solusi saya (sebagian besar berkat solusi Jason R. Coombs)
Saya menyimpan ini sebagai file bernama "effpoptp" (bukan nama sederhana) di folder "/ bin" di komputer saya jadi mengujinya seperti ini:
Tujuannya adalah untuk mengontrol file MySQL Workbench versi, di mana file tersebut bisa menjadi file xml bernama sebagai file workbench, atau file workbench lengkap.
sumber