Bagaimana cara mengunduh arsip dan mengekstraknya tanpa menyimpan arsip ke disk?

62

Saya ingin mengunduh, dan mengekstrak arsip di bawah direktori yang diberikan. Inilah cara saya melakukannya sejauh ini:

wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz
tar zxf dbt2-0.37.50.3.tar.gz
mv dbt2-0.37.50.3 dbt2

Sebagai gantinya saya ingin mengunduh dan mengekstrak arsip dengan cepat , tanpa harus tar.gzmenulis ke disk. Saya pikir ini mungkin dengan menyalurkan output wgetke tar, dan memberikan tartarget, tetapi dalam praktiknya saya tidak tahu bagaimana menyatukannya.

Benjamin
sumber

Jawaban:

95

Anda dapat melakukannya dengan memberi tahu wgetuntuk mengeluarkan payload ke stdout (dengan flag -O-) dan menekan output sendiri (dengan flag -q):

wget -qO- your_link_here | tar xvz -

Untuk menentukan direktori target:

wget -qO- your_link_here | tar xvz - -C /target/directory

Memperbarui

Jika Anda memiliki GNU tar

wget -qO- your_link_here | tar --transform 's/^dbt2-0.37.50.3/dbt2/' -xvz

harus memungkinkan Anda untuk melakukan semuanya dalam satu langkah.

-q diam

-O - output ke stdout

Joseph R.
sumber
Untuk jalur yang ditentukan harus:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo
mungkin hanya memberitahu orang untuk menggunakan tar saja bukan wget?
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>bekerja di gnu tar.
AlikElzin-kilaka
14

Pilihan lain adalah menggunakan curlyang menulis ke stdout secara default:

curl -s some_url | tar xvz -C /tmp
Zlemini
sumber
2
Saya suka pilihan Anda lebih dari yang lain tapicurl -s some_url | tar xvz - -C /tmp
FiftiN
1
seperti yang disarankan FiftiN -> misalnya untuk melihat daftar file yang disaring di dalam repositori, seseorang dapat menggunakan:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev
11

Oneliner ini melakukan trik:

tar xvzf -C /tmp/ < <(wget -q -O - http://foo.com/myfile.tar.gz)

penjelasan singkat: sisi kanan dalam tanda kurung dieksekusi pertama kali ( -qmemberitahu wget untuk melakukannya dengan tenang, -O -digunakan untuk menulis output ke stdout).

Lalu kami membuat pipa bernama menggunakan operator proses substitusi dari Bash <(untuk membuat pipa bernama . Dengan cara ini kita membuat deskriptor file sementara dan kemudian mengarahkan konten deskriptor tersebut ke tar menggunakan <operator pengalihan file.

Ini aku
sumber