enrola o arquivo .gz e canaliza-o para descompressão

13

Estou tentando baixar alguns arquivos .gz (N.B. não .tar.gz ones) de URLs fornecidas e descompactá-los para sobrescrever 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 . 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 descompacte o arquivo .gz , ele funciona.

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

    
por skyork 18.10.2014 / 18:52

2 respostas

17

Um pipe (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 no pipe (daí o erro gunzip ) 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 internos de manipulação de strings do bash)

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

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

curl "$URL" | gunzip -c

(sem a opção -O ), de modo que curl transmita o conteúdo remoto para stdout de onde ele pode ser canalizado para gunzip , mas você precisará redirecionar a saída gunzip para sobrescrever o%code% direcionar arquivo descompactado conforme apropriado.

    
por steeldriver 18.10.2014 / 21:01
4

Siga os redirecionamentos ao fazer o download. Às vezes, um servidor da Web tem redirecionamentos ocultos por motivos de segurança e / ou aleatórios. Se você não seguir o redirecionamento, os dados errados serão baixados e seu aplicativo lendo 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
    
por Jam Risser 19.12.2016 / 09:02