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 quewget 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 absdtar
, los bits de ejecución se desechan. Cuando descargo al disco y extraigo conbsdtar
ounzip
, 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 deunzip
; 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,
- https://github.com/madler/zlib/archive/v1.2.11.zip
- https://github.com/madler/zlib/archive/v1.2.11.tar.gz
- https://github.com/curl/curl/archive/curl-7_68_0.zip
- https://github.com/curl/curl/archive/curl-7_68_0.tar.gz
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 -