Como baixar um arquivo e extraí-lo sem salvar o arquivo em disco?

62

Eu gostaria de baixar e extrair um arquivo em um determinado diretório. Aqui está como eu tenho feito isso até agora:

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

Em vez disso, gostaria de baixar e extrair o arquivo em tempo real , sem ter o tar.gzgravado no disco. Eu acho que isso é possível canalizando a saída de wgetpara tare dando tarum alvo, mas na prática eu não sei como juntar as peças.

Benjamin
fonte

Respostas:

95

Você pode fazer isso dizendo wgetpara enviar sua carga útil para stdout (com sinalizador -O-) e suprimir sua própria saída (com sinalizador -q):

wget -qO- your_link_here | tar xvz -

Para especificar um diretório de destino:

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

Atualizar

Se você tiver GNU tar

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

deve permitir que você faça tudo em uma única etapa.

-q quieto

-O - saída para stdout

Joseph R.
fonte
Para o caminho especificado deve ser:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo 12/09/18
talvez apenas diga às pessoas para usarem o tar, então wget?
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>trabalhou em gnu tar.
AlikElzin-kilaka 22/06
14

Outra opção é usar o curlque escreve no stdout por padrão:

curl -s some_url | tar xvz -C /tmp
Zlemini
fonte
2
Eu gosto da sua opção mais do que outros, mascurl -s some_url | tar xvz - -C /tmp
FiftiN 18/03
1
como sugerido pelo FiftiN -> por exemplo, para exibir uma lista filtrada de arquivos dentro do repositório, pode-se usar:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev
11

Este oneliner faz o truque:

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

breve explicação: o lado direito entre parênteses é executado primeiro ( -qdiz ao wget para fazê-lo silenciosamente, -O -é usado para gravar a saída em stdout).

Em seguida, criamos um pipe nomeado usando o operador de substituição de processo do Bash <(para criar um pipe nomeado . Dessa forma, criamos um descritor de arquivo temporário e, em seguida, direcionamos o conteúdo desse descritor para tar usando o <operador de redirecionamento de arquivo.

Wsou eu
fonte