ikal .gz file dan pipa untuk dekompresi

13

Saya mencoba mengunduh beberapa .gzfile (bukan NB .tar.gz) dari URL yang diberikan dan mendekompresnya untuk menimpa file yang ada, jika ada.

Untuk setiap unduhan individu, saya mencoba yang berikut:

curl -O $URL | gunzip -f

Namun, ini tidak bekerja seperti itu gagal dengan: gzip: stdin: unexpected end of file. Saya menjalankan serangkaian perintah ini di dalam skrip bash shell.

Jika saya menumpahkan perintah menjadi dua langkah eksplisit, yaitu mengunduh file terlebih dahulu, dan kemudian mendekompres .gzfile, itu berhasil.

Mengapa versi perpipaan tidak berfungsi?

skyork
sumber
1
Apakah Anda yakin curl -Obenar - benar stream file ke output standar? Mungkin Anda memikirkannya wget -O-?
steeldriver
@steeldriver Anda harus mempostingnya sebagai ikal jawaban | tar xz ...
Panther
Ada juga --compressed, tetapi ini hanya berfungsi untuk respons terkompresi.
kenorb

Jawaban:

18

Sebuah pipa (diwakili oleh |simbol) mengirimkan output standar dari satu proses ke input standar yang lain. Dalam kasus Anda, Anda tampaknya ingin menggunakan file bernama sehingga pipa tidak sesuai - khususnya, tidak ada yang perlu pipa (karena gunzipkesalahan) karena konten jarak jauh pergi ke file lokal. Sebagai gantinya, Anda perlu mengekstrak nama file - misalnya, dari URL-nya - sesuatu seperti (menggunakan kemampuan manipulasi string bawaan bash)

curl -O "$URL" && gunzip -f "${URL##*/}"

Jika Anda ingin menggunakan pipa, maka cara melakukannya adalah seperti itu

curl "$URL" | gunzip -c

(tanpa -Oopsi) sehingga curlmengalirkan konten jarak jauh stdoutdari tempat itu dapat disalurkan ke gunzip, tetapi kemudian Anda akan perlu mengarahkan kembali gunzipoutput untuk menimpa file target yang tidak terkompresi sesuai keperluan .

Steeldriver
sumber
5

Ikuti arahan ulang saat mengunduh. Terkadang server web memiliki pengalihan tersembunyi untuk alasan keamanan dan / atau acak. Jika Anda tidak mengikuti arahan ulang, data yang salah akan diunduh dan aplikasi Anda yang membaca data yang disalurkan menjadi bingung. Anda dapat mengikuti arahan ulang dengan ikal menggunakan bendera -L.

curl -L https://example.com/mygzip.tar.gz | tar zxv
Jam Risser
sumber