Estou tentando baixar alguns .gz
arquivos (NB não .tar.gz
) de URLs especificadas 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 como ele falhou com: gzip: stdin: unexpected end of file
. Eu executei uma série desse comando dentro de um script de shell bash.
Se eu derramar o comando em duas etapas explícitas, ou seja, primeiro baixe o arquivo e depois descompacte o .gz
arquivo, ele funcionará.
Por que a versão canalizada não funciona?
curl -O
realmente transmite o arquivo para a saída padrão? Talvez você esteja pensandowget -O-
?--compressed
, mas isso funciona apenas para respostas compactadas.Respostas:
Um tubo (representado pelo
|
símbolo) envia a saída padrão de um processo para a entrada padrão de outro. No seu caso, parece que você deseja usar um arquivo nomeado para que um canal não seja apropriado - especificamente, não há nada a ser canalizado (daí ogunzip
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 de manipulação de string incorporados do bash)Se você quiser usar um cachimbo, a maneira de fazer isso seria algo como
(sem a
-O
opção) para quecurl
o conteúdo remoto seja transmitidostdout
de onde ele pode ser canalizadogunzip
, mas você precisará redirecionar agunzip
saída para substituir o arquivo não compactado de destino, conforme apropriado.fonte
Siga os redirecionamentos ao fazer o download. Às vezes, um servidor da Web oculta redirecionamentos por motivos de segurança e / ou aleatórios. Se você não seguir o redirecionamento, os dados incorretos serão baixados e o aplicativo que estiver lendo os dados canalizados ficará confuso. Você pode seguir os redirecionamentos com ondulação usando o sinalizador -L.
fonte