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?

skyork
fonte
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.

chave de aço
fonte
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
Jam Risser
fonte