¿Cómo descargar un archivo y extraerlo sin guardar el archivo en el disco?

62

Me gustaría descargar y extraer un archivo en un directorio determinado. Así es como lo he estado haciendo hasta ahora:

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

En cambio, me gustaría descargar y extraer el archivo sobre la marcha , sin tener que tar.gzescribirlo en el disco. Creo que esto es posible canalizando la salida de wgetto tary dando tarun objetivo, pero en la práctica no sé cómo juntar las piezas.

Benjamín
fuente

Respuestas:

95

Puede hacerlo diciéndole wgetque -O-envíe su carga útil a stdout (con bandera ) y suprima su propia salida (con bandera -q):

wget -qO- your_link_here | tar xvz -

Para especificar un directorio de destino:

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

Actualizar

Si tienes GNU tar

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

debería permitirte hacerlo todo en un solo paso.

-q tranquilo

-O - salida a stdout

Joseph R.
fuente
La ruta especificada debe ser:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo
tal vez solo diga a la gente que use tar en lugar de wget entonces
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>trabajó en gnu tar.
AlikElzin-kilaka
14

Otra opción es usar curlqué escrituras en stdout por defecto:

curl -s some_url | tar xvz -C /tmp
Zlemini
fuente
2
Me gusta su opción más que otras perocurl -s some_url | tar xvz - -C /tmp
FiftiN
1
como sugirió FiftiN -> por ejemplo, para ver una lista filtrada de archivos dentro del repositorio, se podría usar:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev
11

Este oneliner hace el truco:

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

breve explicación: el lado derecho del paréntesis se ejecuta primero ( -qle dice a wget que lo haga en silencio, -O -se usa para escribir la salida en stdout).

Luego creamos una tubería con nombre utilizando el operador de sustitución de proceso de Bash <(para crear una tubería con nombre . De esta manera, creamos un descriptor de archivo temporal y luego dirigimos el contenido de ese descriptor a tar utilizando el <operador de redirección de archivos.

Soy yo
fuente