it-swarm-es.tech

¿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, 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, también, debo saber el nombre del archivo temp.Zip para dárselo 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: redirección ambigua

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

142
Andrew-Dufresne

Debe descargar sus archivos a un archivo temporal porque (citando la página de manual de descompresión):

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

Solo 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 que sea más flexible, probablemente deberías ponerlo en un script para que guardes algo de escritura y para asegurarte de no sobrescribir accidentalmente algo, puedes usar el comando mktemp 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
105
tante

Este es un reenvío de mi respuesta a una pregunta similar:

El formato del 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 parece plantear un problema al intentar leer un archivo Zip a través de una tubería, 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 fallen cuando el archivo se suministra a través de una tubería.

El directorio al final del archivo no es la ubicación solo donde se almacena la metainformación del archivo 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, el front-end de tar y cpio para libarchive (también conocido como bsdtar y bsdcpio) puede y lo hará hacerlo al leer a través de una tubería, lo que significa que es posible lo siguiente:

wget -qO- http://example.org/file.Zip | bsdtar -xvf-
84
ruario

Si tiene instalado el JDK, puede usar jar:

wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
22
Rory Hunter

No creo que quiera molestarse en descomprimir la salida de wget de tubería.

De la wikipedia "Zip (formato de archivo)" artículo:

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

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

15
Bruce Ediger

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 function para establecer el desplazamiento del archivo al final para leer su final de central registro de directorio . Se encuentra al final de la estructura de archivo y es necesario leer la lista de archivos (ver: Estructura de formato de archivo Zip ). Por lo tanto, el archivo no puede ser FIFO, tubería, dispositivo terminal o cualquier otra dinámica, porque el objeto de entrada no puede ser posicionado por la función lseek.

Entonces tiene las siguientes soluciones:

  • usar diferentes tipos de compresión (por ejemplo, tar.gz),
  • tienes que usar dos comandos separados,
  • usar herramientas alternativas (como se sugiere en otras respuestas),
  • cree un alias o función para usar múltiples comandos.
11
kenorb

Repost of 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 usar stdin como entrada.

Usted puede incluso,

cat file.Zip | busybox unzip -

Pero eso es redundante de unzip file.Zip.

Si su distribución usa BusyBox de forma predeterminada (por ejemplo, Alpine), simplemente ejecute unzip -.

11
Saftever

Si solo hay un archivo en 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 "[email protected]"
/bin/zcat:exec gzip -cd "[email protected]"
0
SebMa

Un archivo Zip no es secuencial (ya que puede tener la tabla de contenido al final del archivo), por lo que es difícil descomprimirlo. Intente ver si puede obtener otro formato de archivo, como .tar.gz.

Si estás descargando un .Zip archivo de GitHub, casi siempre hay un .tar.gz versión disponible.

Por ejemplo,

¿Ves el patrón? Solo reemplace .Zip con .tar.gz y canaliza a | tar xzf -

0
rustyx