¿Puedo hacer que descomprimir o algún programa similar funcione en la salida estándar? La situación es que estoy descargando un archivo zip, que se supone que debe descomprimirse sobre la marcha.
Problema relacionado: ¿Cómo canalizo un archivo descargado a la salida estándar en bash?
linux
ubuntu
pipe
compression
Alex
fuente
fuente
Respuestas:
Si bien un archivo zip es, de hecho, un formato contenedor, no hay ninguna razón por la que no se pueda leer desde una tubería (stdin) si el archivo puede caber en la memoria con la suficiente facilidad. Aquí hay un script de Python que toma un archivo zip como entrada estándar y extrae el contenido al directorio actual o a un directorio específico, si se especifica.
Este script se puede minimizar a una línea y crear como un alias.
Ahora descomprima la salida de wget fácilmente.
fuente
.read()
métodoEs poco probable que esto funcione como espera. Zip no es solo un formato de compresión, sino también un formato contenedor. Enrolla los trabajos de tar y gzip.bzip2 en uno. Dicho esto, si su archivo zip tiene un solo archivo, puede usar descomprimir -p para extraer los archivos a stdout. Si tiene más de un archivo, no hay forma de que sepa dónde comienzan y dónde se detienen.
En cuanto a la lectura de stdin, la página de manual de descompresión tiene esta oración:
Puede que tengas suerte con funzip.
fuente
Lo que desea hacer es
unzip
tomar un archivo ZIP en su entrada estándar en lugar de como argumento. Esto se hace generalmente fácil porgzip
ytar
tipo de herramientas con un-
argumento. Pero el estándarunzip
no hace eso (sin embargo, admite la extracción a una tubería). Sin embargo, no todo está perdido...Mira la página del manual de funzip .
Esto va bien con la idea de que la mayoría de los archivos de Linux suelen estar TAR'ed y luego comprimidos de alguna manera (gzip, bzip, et al). Esto funcionará para usted si tiene un
tar.ZIP
.Vale la pena señalar que
funzip
está escrito por el autor original de Info-ZIP, Mark Adler. Él escribe en la página de manual de funzip,sin embargo, no se ve tal actualización alrededor. Sospecho que Mark lo consideró innecesario ya que otros métodos de archivo funcionaron fácilmente con TAR.
fuente
Me gusta usar curl porque está instalado de forma predeterminada (
-L
es necesario para los redireccionamientos que a menudo ocurren):Sin embargo,
bsdtar
no está instalado de manera predeterminada y no pude ponermefunzip
a trabajar.fuente
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
No es posible con Info-Zip, que es la implementación de OSS más común. Sin embargo, lo más importante es que no se recomienda debido a las construcciones de los archivos ZIP.
Si un cambio de formato es viable para usted, considere usar tar (1) en su lugar. Está bastante contento con la entrada / salida transmitida y, de hecho, lo espera de forma predeterminada.
Además, a menudo puede saber si las aplicaciones esperan entrada / salida transmitida especificando "-" para un nombre de archivo. Info-Zip, como puedes imaginar, no trata esto como un argumento válido.
fuente
En zsh, puede hacer lo siguiente:
fuente
La utilidad común más simple disponible que hará esto es
jar
, lo que supondrá que se está utilizando STDIN si no le pasa ningún argumento de archivo. También toma argumentos similares altar
programa para las operaciones.por ejemplo, enumerar el contenido de un archivo
curl https://my.example.com/file.zip | jar t
Si bien Java no siempre está instalado, en esas máquinas donde está,
jar
es definitivamente el método más conveniente para hacerlo.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.Usted puede incluso,
Pero eso es redundante
unzip file.zip
.Si su distribución usa BusyBox de forma predeterminada (por ejemplo, Alpine), simplemente ejecute
unzip -
.fuente
De hecho, necesitaba algo un poco más complejo: extraer un archivo específico si existe. La dificultad es que la secuencia del archivo de entrada puede no ser un archivo zip, y en ese caso, lo necesitaba para continuar a través de la tubería. Aquí está mi solución (gracias principalmente a la solución Jason R. Coombs)
Lo guardé como un archivo llamado "effpoptp" (no un nombre simple) en la carpeta "/ bin" en mi máquina, por lo que probarlo es así:
El propósito es controlar la versión de los archivos de MySQL Workbench, donde el archivo podría ser el archivo xml nombrado como el archivo de workbench o el archivo completo de workbench.
fuente