arricciare il file .gz e pipe per decompressione


13

Sto cercando di scaricare alcuni .gzfile (NB non .tar.gzquelli) da determinati URL e decomprimerli per sovrascrivere eventuali file esistenti.

Per ogni singolo download, ho provato quanto segue:

curl -O $URL | gunzip -f

Tuttavia, questo non ha funzionato come non è riuscito con: gzip: stdin: unexpected end of file. Ho eseguito una serie di questo comando all'interno di uno script shell bash.

Se ho inserito il comando in due passaggi espliciti, ovvero prima scaricare il file e quindi decomprimerlo .gz, funziona.

Perché la versione con piping non funziona?


1
Sei sicuro che curl -Otrasmette effettivamente il file allo standard output? Forse stai pensando wget -O-?
Steeldriver,

@steeldriver dovresti pubblicarlo come un ricciolo di risposta | tar xz ...
Pantera,

C'è anche --compressed, ma questo funziona solo per risposte compresse.
Kenorb,

Risposte:


18

Una pipe (rappresentata dal |simbolo) invia l' output standard di un processo all'input standard di un altro. Nel tuo caso, sembra che tu voglia utilizzare un file denominato in modo che una pipe non sia appropriata - in particolare, non c'è nulla da pipe (quindi l' gunziperrore) perché i contenuti remoti stanno andando a un file locale. Invece, dovresti estrarre il nome del file - ad esempio, dal suo URL - qualcosa del genere (usando le funzionalità di manipolazione delle stringhe integrate di bash)

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

Se vuoi usare una pipe, allora il modo per farlo sarebbe qualcosa di simile

curl "$URL" | gunzip -c

(senza l' -Oopzione) in modo da curltrasmettere il contenuto remoto stdoutda dove può essere gunzipreindirizzato, ma sarà necessario reindirizzare l' gunzipoutput per sovrascrivere il file non compresso di destinazione come appropriato.


5

Segui i reindirizzamenti durante il download. A volte un server Web ha reindirizzamenti nascosti per motivi di sicurezza e / o casuali. Se non segui il reindirizzamento, i dati errati vengono scaricati e l'applicazione che legge i dati inviati viene confusa. Puoi seguire i reindirizzamenti con l'arricciatura usando il flag -L.

curl -L https://example.com/mygzip.tar.gz | tar zxv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.