enrolar o arquivo .gz e enviá-lo para descompactação


13

Estou tentando baixar alguns .gzarquivos (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 .gzarquivo, ele funcionará.

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


1
Tem certeza de que curl -Orealmente transmite o arquivo para a saída padrão? Talvez você esteja pensando wget -O-?
steeldriver

@steeldriver você deve postar isso como resposta curl | tar xz ...
Panther

Existe também --compressed, mas isso funciona apenas para respostas compactadas.
kenorb

Respostas:


18

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í 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 de manipulação de string incorporados do bash)

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

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

curl "$URL" | gunzip -c

(sem a -Oopção) para que curlo conteúdo remoto seja transmitido stdoutde onde ele pode ser canalizado gunzip, mas você precisará redirecionar a gunzipsaída para substituir o arquivo não compactado de destino, conforme apropriado.


5

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.

curl -L https://example.com/mygzip.tar.gz | tar zxv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.