Come scaricare un archivio ed estrarlo senza salvare l'archivio su disco?


62

Vorrei scaricare ed estrarre un archivio in una determinata directory. Ecco come l'ho fatto finora:

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

Vorrei invece scaricare ed estrarre l'archivio al volo , senza averlo tar.gzscritto sul disco. Credo che questo sia possibile, eseguendo il piping dell'output di wgeta tar, e dando tarun obiettivo, ma in pratica non so come mettere insieme i pezzi.

Risposte:


95

Puoi farlo dicendo wgetdi inviare il suo payload a stdout (con flag -O-) e di sopprimere il proprio output (con flag -q):

wget -qO- your_link_here | tar xvz -

Per specificare una directory di destinazione:

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

Aggiornare

Se ti capita di avere GNU tar

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

dovrebbe permetterti di fare tutto in un solo passaggio.

-q silenzioso

-O - output su stdout


Nel percorso specificato dovrebbe essere:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo,

forse semplicemente dire alla gente di usare tar invece di wget allora?
Alexander Mills,

wget -qO- <url> | tar -xvz -C <target folder>lavorato su gnu tar.
AlikElzin-Kilaka,

14

Un'altra opzione è usare quella curlche scrive di default su stdout:

curl -s some_url | tar xvz -C /tmp

2
Mi piace la tua opzione più di altre macurl -s some_url | tar xvz - -C /tmp
FiftiN

1
come suggerito FiftiN -> ad es. per visualizzare un elenco filtrato di file all'interno del repository si potrebbe usare:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev

11

Questo oneliner fa il trucco:

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

breve spiegazione: il lato destro tra parentesi viene eseguito per primo ( -qdice a wget di farlo in silenzio, -O -viene usato per scrivere l'output su stdout).

Quindi creiamo una pipa denominata utilizzando l'operatore di sostituzione del processo da Bash <(per creare una pipa denominata . In questo modo creiamo un descrittore di file temporaneo e quindi indirizziamo il contenuto di quel descrittore su tar usando l' <operatore di reindirizzamento dei file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.