curl arquivo .gz e canalize-o para descompactação

curl arquivo .gz e canalize-o para descompactação

Estou tentando baixar alguns .gzarquivos (NB, não .tar.gzaqueles) de determinados URLs e descompactá-los para substituir os arquivos existentes, se houver.

Para cada download individual, tentei o seguinte:

curl -O $URL | gunzip -f

No entanto, isso não funcionou porque falhou com: gzip: stdin: unexpected end of file. Executei uma série desse comando dentro de um script shell bash.

Se eu dividisse o comando em duas etapas explícitas, ou seja, primeiro baixe o arquivo e depois descompacte-o .gz, ele funcionará.

Por que a versão canalizada não funciona?

Responder1

Um tubo (representado pelo| símbolo) envia osaída padrãode um processo para oentrada padrãode outro. No seu caso, parece que você deseja usar um arquivo nomeado, portanto, um canal não é apropriado - especificamente, não há nada para canalizar (daí o gunziperro) porque o conteúdo remoto está indo para um arquivo local. Em vez disso, você precisaria extrair o nome do arquivo - por exemplo, de sua URL - algo como (usando os recursos integrados de manipulação de strings do bash)

curl -O "$URL" && gunzip -f "${URL##*/}"

Se você quiser usar um cano, a maneira de fazer isso seria algo como

curl "$URL" | gunzip -c

(sem a -Oopção) para que curltransmita o conteúdo remoto para stdoutonde ele pode ser canalizado gunzip, mas então você precisaria redirecionar a gunzipsaída para substituir o arquivo descompactado de destino conforme apropriado.

Responder2

Siga os redirecionamentos ao fazer o download. Às vezes, um servidor web oculta redirecionamentos por motivos de segurança e/ou aleatórios. Se você não seguir o redirecionamento, os dados errados serão baixados e o aplicativo que lê os dados canalizados ficará confuso. Você pode seguir redirecionamentos com curl usando o sinalizador -L.

curl -L https://example.com/mygzip.tar.gz | tar zxv

Responder3

O abaixo faz 3 coisas

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. Force cria o diretório de destino
  2. Desarquiva o arquivo no diretório fornecido
  3. Substitui o diretório raiz pelo nome de diretório fornecido simplesmente removendo o diretório raiz do arquivo.

informação relacionada