Estoy tratando de descargar algunos .gz
archivos (NB no .tar.gz
unos) de las URL dadas y descomprimirlos para sobrescribir los archivos existentes, si los hay.
Para cada descarga individual, probé lo siguiente:
curl -O $URL | gunzip -f
Sin embargo, esto no funciona, ya que no pudo con: gzip: stdin: unexpected end of file
. Ejecuté una serie de este comando dentro de un script de shell bash.
Si derramé el comando en dos pasos explícitos, es decir, primero descargue el archivo y luego descomprima el .gz
archivo, funciona.
¿Por qué la versión canalizada no funciona?
curl -O
realmente transmite el archivo a la salida estándar? Quizás estás pensandowget -O-
?--compressed
, pero esto funciona solo para respuestas comprimidas.Respuestas:
Una tubería (representada por el
|
símbolo) envía la salida estándar de un proceso a la entrada estándar de otro. En su caso, parece que desea utilizar un archivo con nombre, por lo que una tubería no es apropiada, específicamente, no hay nada que canalizar (de ahí elgunzip
error) porque el contenido remoto va a un archivo local. En cambio, necesitaría extraer el nombre del archivo, por ejemplo, de su URL, algo así como (usando las capacidades de manipulación de cadenas incorporadas de bash)Si desea usar una tubería, entonces la forma de hacerlo sería algo así como
(sin la
-O
opción) para quecurl
transmita el contenido remotostdout
desde donde se puede canalizargunzip
, pero luego deberá redirigir lagunzip
salida para sobrescribir el archivo sin comprimir de destino, según corresponda.fuente
Siga las redirecciones al descargar. A veces, un servidor web tiene redireccionamientos ocultos por razones de seguridad y / o aleatorias. Si no sigue la redirección, se descargan los datos incorrectos y su aplicación que lee los datos canalizados se confunde. Puedes seguir los redireccionamientos con curl usando la bandera -L.
fuente