Tengo que descargar un archivo desde 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 unzip
.
¿Es posible redirigir la salida de wget
to 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.
command-line
io-redirection
Andrew-Dufresne
fuente
fuente
Respuestas:
Debe descargar sus archivos a un archivo temporal porque (citando la página del manual de descompresión):
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
mktemp
comando para crear un nombre de archivo seguro para tu archivo temporal:fuente
wget file.zip && unzip file.zip
igualwget file.zip; unzip file.zip
o se prefiere uno sobre el otro? Gracias :)wget && unzip
se ejecutará descomprimir solo si wget tuvo éxito.wget ; unzip
se ejecutará descomprimir de todos modos, posiblemente apuntando a un archivo inexistente.Esta es una nueva publicación 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 parecería 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 única ubicación donde se almacena la información meta 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, los front-end tar y cpio para libarchive (también conocido como bsdtar y bsdcpio) pueden y lo harán al leer a través de una tubería, lo que significa que lo siguiente es posible:
fuente
.zip
archivo aquí que contiene archivos con permisos ejecutables. Cuando descargo y canalizobsdtar
, los bits de ejecución se descartan. Cuando descargo al disco y extraigo conbsdtar
ounzip
luego, se respetan los bits de ejecución.bsdtar
abre o no se puede buscar, se usa uno u otro lugar.Si tiene instalado el JDK, puede usar
jar
:fuente
jar
no conserva los permisos de archivo. Buen truco de lo contrario.| jar xv
No creo que quiera molestarse en descomprimir la salida de wget de tubería.
Del artículo "ZIP (formato de archivo)" de Wikipedia:
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.
fuente
La sintaxis adecuada sería:
pero no funcionará debido al error ( Info-ZIP en Debian ):
o en BSD / OS X:
Esto se debe a que las herramientas zip estándar utilizan principalmente la
lseek
función para establecer el desplazamiento del archivo al final para leer el final del registro del directorio central . 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 la función no puede colocar el objeto de entradalseek
.Entonces tiene las siguientes soluciones:
tar.gz
. ej. )fuente
Publicación de mi respuesta :
BusyBox
unzip
puede tomar stdin y extraer todos los archivos.El guión después
unzip
es usar stdin como entrada.Tu puedes incluso,
Pero eso es redundante
unzip file.zip
.Si su distribución usa BusyBox de forma predeterminada (por ejemplo, Alpine), simplemente ejecute
unzip -
.fuente
Esto me funciona bastante bien:
fuente