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.
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
Une autre option consiste à utiliser curl
qui écrit par défaut sur stdout:
curl -s some_url | tar xvz -C /tmp
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.