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

48

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

Eu gostaria de baixar e extrair o arquivo on the fly , sem ter o tar.gz escrito no disco. Acho que isso é possível canalizando a saída de wget para tar e dando tar a meta, mas na prática não sei como juntar as peças.

    
por Benjamin 01.08.2013 / 16:19

3 respostas

78

Você pode fazer isso dizendo wget para enviar sua carga 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 o GNU tar

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

deve permitir que você faça tudo de uma vez.

    
por 01.08.2013 / 16:23
10

Esse oneliner faz o truque:

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

breve explicação: o lado direito do parêntese é executado primeiro ( -q diz ao wget para fazê-lo silenciosamente, -O - é usado para gravar a saída para 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 < .

    
por 01.08.2013 / 16:49
5

Outra opção é usar curl , que grava no stdout por padrão:

curl -s some_url | tar xvz -C /tmp
    
por 12.03.2018 / 22:46