Toutes les idées sur la façon de décompresser un fichier Zip canalisé comme ceci:
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip
Je souhaitais décompresser le fichier dans un répertoire, comme nous le faisions avec un fichier normal:
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | unzip -d ~/Desktop
wget -qO- -O tmp.Zip http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip && unzip tmp.Zip && rm tmp.Zip
Le format de fichier Zip comprend un répertoire (index) à la fin de l'archive. Ce répertoire indique où, dans l'archive, chaque fichier est situé et permet ainsi un accès rapide et aléatoire, sans lire l'archive entière.
Cela semblerait poser un problème lors de la tentative de lecture d'une archive Zip via un canal, dans la mesure où l'index n'est accessible qu'à la toute fin et que les membres individuels ne peuvent être correctement extraits qu'après que le fichier a été entièrement lu et n'est plus disponible . En tant que tel, il ne semble pas surprenant que la plupart des décompresseurs Zip échouent simplement lorsque l'archive est fournie via un canal.
Le répertoire à la fin de l'archive n'est pas l'emplacement niquement où les métadonnées du fichier sont stockées dans l'archive. De plus, les entrées individuelles incluent également ces informations dans un en-tête de fichier local, à des fins de redondance.
Bien que tous les décompresseurs Zip n'utilisent pas les en-têtes de fichiers locaux lorsque l'index n'est pas disponible, les frontaux tar et cpio de libarchive (aka bsdtar et bsdcpio) peuvent et vont le faire lors de la lecture via un tube, ce qui signifie que ce qui suit est possible:
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | bsdtar -xvf- -C ~/Desktop
Bien que ce qui suit ne fonctionnera pas dans bash, il fonctionnera dans zsh. Étant donné que de nombreux utilisateurs de zsh peuvent se retrouver ici, cela peut toujours être utile:
unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip )
utilisez simplement zcat
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | zcat >> myfile.txt
J'aimerais jeter un œil à funzip (http://www.info-Zip.org/mans/funzip.html). La page de manuel pour cela note,
...filter for extracting from a Zip archive in a pipe
Désolé, je n'ai pas d'exemple, mais il semble qu'il soit livré avec l'utilitaire de décompression Linux.
unzip
de BusyBox peut prendre stdin et extraire tous les fichiers.
wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | busybox unzip -
Le tiret après unzip
est d'utiliser stdin comme entrée.
Vous pouvez même,
cat file.Zip | busybox unzip -
Mais c'est tout simplement redondant de unzip file.Zip
.
Si votre distribution utilise BusyBox par défaut (par exemple Alpine), exécutez simplement unzip -
.