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.

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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.