Comment télécharger une archive et l'extraire sans la sauvegarder sur disque?

62

Je voudrais télécharger et extraire une archive sous un répertoire donné. Voici comment je l'ai fait jusqu'à présent:

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

J'aimerais plutôt télécharger et extraire l'archive à la volée , sans avoir à l' tar.gzécrire sur le disque. Je pense que cela est possible en filtrant la sortie de wgetto taret en donnant tarune cible, mais en pratique, je ne sais pas comment assembler les éléments.

Benjamin
la source

Réponses:

95

Vous pouvez le faire en disant wgetde sortir sa charge utile sur stdout (avec indicateur -O-) et de supprimer sa propre sortie (avec indicateur -q):

wget -qO- your_link_here | tar xvz -

Pour spécifier un répertoire cible:

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

Mise à jour

Si vous avez GNU tar

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

devrait vous permettre de tout faire en une seule étape.

-q silencieux

-O - sortie sur stdout

Joseph R.
la source
Le chemin spécifié doit être:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo le
peut-être juste dire aux gens d'utiliser le goudron plutôt wget alors?
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>travaillé sur gnu tar.
AlikElzin-kilaka
14

Une autre option consiste à utiliser curlce qui écrit sur stdout par défaut:

curl -s some_url | tar xvz -C /tmp
Zlemini
la source
2
J'aime votre option plus que d'autres maiscurl -s some_url | tar xvz - -C /tmp
FiftiN
1
comme suggéré par FiftiN -> par exemple, pour afficher une liste filtrée de fichiers dans le référentiel, on pourrait utiliser:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev le
11

Cet oneliner fait l'affaire:

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

brève explication: le côté droit de la parenthèse est exécuté en premier ( -qindique à wget de le faire tranquillement, il -O -est utilisé pour écrire le résultat sur stdout).

Ensuite, nous créons un canal nommé en utilisant l'opérateur de substitution de processus de Bash <(pour créer un canal nommé . De cette façon, nous créons un descripteur de fichier temporaire, puis dirigeons le contenu de ce descripteur vers tar à l'aide de l' <opérateur de redirection de fichier.

C'est moi
la source