¿Cómo redirigir la salida de wget como entrada para descomprimir?

Tengo que descargar un archivo de este enlace . La descarga del archivo es un archivo zip que tendré que descomprimir en la carpeta actual.

Normalmente, lo descargaría primero y luego ejecutaría el comando descomprimir.

$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip $ unzip temp.zip 

Pero de esta manera, necesito ejecutar dos comandos, esperar a que se complete el primero para ejecutar el siguiente, además, debo saber el nombre del archivo temp.zip para entregarlo a unzip.

¿Es posible redirigir la salida de wget a unzip? Algo como

$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834` 

Pero no funcionó.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip: redireccionamiento ambiguo

Además, wget se ejecutó dos veces y descargué el archivo dos veces.

Comentarios

  • En el último ejemplo, wget probablemente se ejecutó dos veces porque? es un carácter especial en el shell . Poner la URL en » » s debería ayudar.
  • Este hilo parece tener una solución. Haven ‘ no lo probé yo mismo. serverfault.com/questions/26474/…

Respuesta

Tienes que descargar tus archivos a un archivo temporal, porque (citando el descomprimir man page):

Los archivos leídos desde la entrada estándar aún no son compatibles, excepto con funzip (y luego solo el primer m (se puede extraer la brasa del archivo).

Simplemente reúna los comandos:

wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip unzip temp.zip rm temp.zip 

Pero para hacerlo más flexible, probablemente debería ponerlo en una secuencia de comandos para guardar algo de escritura y para asegurarse de no sobrescribir accidentalmente algo, podría usar el mktemp comando para crear un nombre de archivo seguro para su archivo temporal:

#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE 

Comentarios

  • Es wget file.zip && unzip file.zip igual que wget file.zip; unzip file.zip o ¿se prefiere uno sobre el otro? Gracias 🙂
  • @NextLocal wget && unzip se ejecutará descomprimir solo si wget tuvo éxito. wget ; unzip se ejecutará unzip de todos modos, posiblemente apuntando a un archivo inexistente.
  • funzip era la respuesta que estaba buscando. Terraform (por alguna razón) lo empaqueta ‘ s binario como un solo archivo en un archivo zip, así que esto fue perfecto para mí.

Responder

Esta es una nueva publicación de mi respuesta a una pregunta similar:

El formato de archivo ZIP incluye un directorio (índice) al final del archivo. Este directorio dice dónde, dentro del archivo, se encuentra cada archivo y, por lo tanto, permite un acceso rápido y aleatorio sin leer todo el archivo.

Esto parecería plantear un problema al intentar leer un archivo ZIP a través de un pipe, ya que no se accede al índice hasta el final y, por lo tanto, los miembros individuales no se pueden extraer correctamente hasta que el archivo se haya leído por completo y ya no esté disponible. Como tal, no parece sorprendente que la mayoría de los descompresores ZIP simplemente fallan cuando el archivo se suministra a través de una tubería.

El directorio al final del archivo no es la única ubicación donde el archivo meta la información se almacena en el archivo. Además, las entradas individuales también incluyen esta información en un encabezado de archivo local, con fines de redundancia.

Aunque no todos los descompresores ZIP usarán encabezados de archivos locales cuando el índice no esté disponible, las interfaces tar y cpio para libarchive (también conocidas como bsdtar y bsdcpio) pueden y lo harán cuando leyendo a través de una tubería, lo que significa que es posible lo siguiente:

wget -qO- http://example.org/file.zip | bsdtar -xvf- 

Comentarios

  • Esto es excelente ! Me gustaría señalar que tar me da algunas advertencias acerca de que los datos sin comprimir tienen un tamaño incorrecto (esperado 0), pero los archivos en sí parecen no estar dañados. Supongo que esto se debe a la falta del índice.
  • Tengo un archivo .zip aquí que contiene archivos con permisos ejecutables. Cuando descargo y canalizo a bsdtar, los bits de ejecución se desechan. Cuando descargo al disco y extraigo con bsdtar o unzip, se respetan los bits de ejecución.
  • // , @GolarRamblar, ¿alguna vez averiguaste por qué?
  • @NathanBasanese: aquí es la respuesta. En resumen: un archivo ZIP tiene dos lugares donde almacena dicha información, que pueden ser inconsistentes, y dependiendo de si el archivo bsdtar abre es buscable o no, usa uno u otro lugar .

Respuesta

Si tiene el JDK instalado, puede usar jar:

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin 

Comentarios

  • Acabo de encontrar que jar no ‘ t preserva los permisos de archivo. Buen truco de lo contrario.
  • No ‘ no necesitas dar un parámetro de archivo, solo usa | jar xv
  • Yo también fui mordido por la suposición de que jar podría usarse como reemplazo de unzip; Lamentablemente, jar no restaura los archivos extraídos ‘ permisos;
  • Simplemente use | jar x
  • jar maneja mucho mejor los nombres de archivo UTF-8. unzip cosas destrozadas.

Responder

No lo hago cree que incluso quiere molestarse en canalizar la salida de wget para descomprimir.

Del artículo «ZIP (formato de archivo)» de wikipedia:

Un archivo ZIP se identifica por la presencia de un directorio central ubicado al final del archivo.

wget tiene que finalizar completamente la descarga antes de que descomprimir pueda hacer cualquier trabajo, por lo que se ejecutan secuencialmente, no entretejidos como uno podría pensar.

Respuesta

Volver a publicar mi respuesta :

BusyBox «s unzip puede tomar stdin y extraer todos los archivos.

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip - 

El guión después de unzip es para usar stdin como entrada.

Incluso,

cat file.zip | busybox unzip - 

Pero eso «es simplemente redundante de unzip file.zip.

Si su distribución usa BusyBo x por defecto (p. ej. Alpine), simplemente ejecute unzip -.

Comentarios

  • más allá de @Saftever ‘ s respuesta, que no ‘ no puedo comentar, busybox funcionará pero las versiones anteriores a 1.27.0 ganaron ‘ t debido a una búsqueda redundante, consulte el registro de cambios busybox.net

Respuesta

La sintaxis adecuada sería:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip) 

pero no «funcionará debido al error ( Info-ZIP en Debian ):

lseek(3, 0, SEEK_SET) = -1 ESPIPE (Illegal seek) Archive: /dev/fd/63 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of /dev/fd/63 or /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period. 

o en BSD / OS X:

Trying to read large file (> 2 GiB) without large file support 

Esto se debe a que las herramientas zip estándar utilizan principalmente lseek función para establecer el desplazamiento del archivo al final para leer su final del registro del directorio central . Se encuentra al final de la estructura del archivo y es necesario leer la lista de los archivos (ver: Estructura de formato de archivo zip ). Por lo tanto, el archivo no puede ser FIFO, pipe, terminal o cualquier otra dinámica, porque el objeto de entrada no puede ser posicionado por la función lseek.

Así que tienes la siguientes soluciones:

  • use un tipo diferente de compresión (por ejemplo, tar.gz),
  • usted tiene que usar dos comandos separados,
  • use herramientas alternativas (como se sugiere en otras respuestas),
  • cree un alias o función para usar múltiples comandos.

Comentarios

  • Creo que todavía podría ser un FIFO. Usted ‘ solo tendrá que seguir leyendo desde el FIFO hasta EOF (almacenando efectivamente todo el FIFO en la memoria o en un archivo temporal). Totalmente factible para facilitar la creación de scripts, pero no muy útil.

Respuesta

Si solo hay un archivo zip, puede usar zcat o gunzip:

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip 

FYI: Aquí están las definiciones de gunzip y zcat en mi sistema:

$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@" 

Respuesta

Un archivo zip no es secuencial porque a menudo tiene la tabla de contenido al final del archivo, por lo que es difícil descomprimirlo.

Una solución alternativa es ver si puede obtener otro formato de archivo, como .tar.gz.

Por ejemplo, si «estás descargando un archivo .zip de GitHub, casi siempre hay un .tar.gz versión disponible.

Por ejemplo,

Observe el patrón: simplemente reemplace .zip con .tar.gz y canalice a | tar xzf -

Respuesta

Esto me funciona bastante bien:

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -  

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *