Estou tentando baixar alguns .gz
arquivos (NB, não .tar.gz
aqueles) 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 gunzip
erro) 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 -O
opção) para que curl
transmita o conteúdo remoto para stdout
onde ele pode ser canalizado gunzip
, mas então você precisaria redirecionar a gunzip
saí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
- Force cria o diretório de destino
- Desarquiva o arquivo no diretório fornecido
- Substitui o diretório raiz pelo nome de diretório fornecido simplesmente removendo o diretório raiz do arquivo.