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.
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
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-
Si tiene instalado el JDK, puede usar jar
:
wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
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.
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:
tar.gz
),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 -
.
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]"
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 -