web-dev-qa-db-fra.com

Bash - comment décompresser un fichier Zip canalisé (à partir de "wget ​​-qO-")

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
27
Roger
wget -qO- -O tmp.Zip http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip && unzip tmp.Zip && rm tmp.Zip
10
leon

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
30
ruario

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 )
6
Ian Robertson

utilisez simplement zcat

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.Zip | zcat >> myfile.txt
  • Cela extraira uniquement le premier fichier. Vous verrez ce message d'erreur "gzip: stdin a plus d'une entrée - reste ignoré" après l'extraction du premier fichier.
5
lanzalibre

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.

4
Sam Cantrell

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 -.

3
Saftever