Estoy intentando descargar algunos .gz
archivos (NB, no .tar.gz
algunos) de las URL determinadas 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 funcionó porque falló con: gzip: stdin: unexpected end of file
. Ejecuté una serie de este comando dentro de un script de shell bash.
Si dividí el comando en dos pasos explícitos, es decir, primero descargué el archivo y luego lo descomprimí .gz
, funciona.
¿Por qué la versión canalizada no funciona?
Respuesta1
Una tubería (representada por el |
símbolo) envía lasalida estándarde un proceso alentrada estándarde otro. En su caso, parece que desea utilizar un archivo con nombre, por lo que una canalización no es apropiada; específicamente, no hay nada que canalizar (de ahí el gunzip
error) porque el contenido remoto va a un archivo local. En su lugar, necesitaría extraer el nombre del archivo, por ejemplo, de su URL, algo así como (usando las capacidades integradas de manipulación de cadenas de bash)
curl -O "$URL" && gunzip -f "${URL##*/}"
Si desea utilizar una tubería, entonces la forma de hacerlo sería algo así como
curl "$URL" | gunzip -c
(sin la -O
opción) para que curl
transmita el contenido remoto stdout
desde donde se puede canalizar gunzip
, pero luego deberá redirigir la gunzip
salida para sobrescribir el archivo de destino sin comprimir según corresponda.
Respuesta2
Siga las redirecciones al descargar. A veces, un servidor web tiene redirecciones ocultas por motivos de seguridad y/o aleatorios. Si no sigue la redirección, se descargan datos incorrectos y la aplicación que lee los datos canalizados se confunde. Puedes seguir redirecciones con curl usando la bandera -L.
curl -L https://example.com/mygzip.tar.gz | tar zxv
Respuesta3
Lo siguiente hace 3 cosas
mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
- Forzar la creación del directorio de destino.
- Desarchiva el archivo en el directorio indicado
- Reemplaza el directorio raíz con el nombre del directorio dado simplemente eliminando el directorio raíz del archivo.