web-dev-qa-db-fra.com

Comment télécharger une archive et l'extraire sans enregistrer l'archive sur le disque?

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 le tar.gz écrit sur le disque. Je pense que cela est possible en canalisant la sortie de wget vers tar, et en donnant à tar une cible, mais en pratique, je ne sais pas comment assembler les morceaux.

69
Benjamin

Vous pouvez le faire en disant à wget de sortir sa charge utile vers stdout (avec l'indicateur -O-) et supprime sa propre sortie (avec l'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

S'il vous arrive d'avoir 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 vers stdout

105
Joseph R.

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

curl -s some_url | tar xvz -C /tmp
15
Zlemini

Cet oneliner fait l'affaire:

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

courte explication: le côté droit entre parenthèses est exécuté en premier (-q dit à wget de le faire tranquillement, -O - est utilisé pour écrire la sortie sur stdout).

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

11
ItsMe