52 votes

Décompression des fichiers qui sont envoyés dans un tuyau

Puis-je faire fonctionner unzip ou tout autre programme similaire sur la sortie standard? La situation est que je télécharge un fichier zip, qui est censé être décompressé à la volée.

Problème connexe : Comment puis-je rediriger un fichier téléchargé vers la sortie standard en bash?

0 votes

Cela semblait réalisable, mais il semble que ce soit seulement possible d'extraire un fichier zip et de le transmettre à une autre commande si le zip contient un seul fichier. Je voulais extraire un fichier spécifique d'un zip multi-fichier. Au lieu de transmettre, j'ai opté pour l'enchaînement de plusieurs commandes 'unzip file.zip /chemin/fichier && dostuff /chemin/fichier && rm -rf /chemin'. Bien que cela ne réponde pas à la question initiale et implique la création de fichiers temporaires, cela a satisfait mon besoin.

0 votes

Vérifiez pigz. Nous l'utilisons dans un tuyau. andrew.tumblr.com/post/2316602611

1voto

pts Points 415

J'ai écrit un script Python (2.x) pour extraire en streaming des archives ZIP (qui utilise une quantité de mémoire constante peu importe la taille du fichier ZIP), vous pouvez le trouver ici: https://raw.githubusercontent.com/pts/unzip_scan/master/unzip_scan.py. Utilisation: cat fichier.zip | sh unzip_scan.py -.

La fonction scan_zip implémente un parseur (et un décompresseur) en streaming pour le format de fichier ZIP (et Zip64), incluant quelques extensions (pour supporter des fichiers membres plus grands que 4 GiB, et pour extraire également l'heure de dernière modification). Elle utilise zlib.decompressobj (faisant partie de la bibliothèque standard Python, le gros du travail étant implémenté en C) pour la décompression Flate réelle.

0 votes

Plutôt que de simplement faire un lien vers un fichier, pourriez-vous expliquer et inclure au moins les extraits de code principaux?

0 votes

@SEoF: Malheureusement, il n'est pas possible de réutiliser une petite partie de ce fichier sans le reste en raison des dépendances internes, donc le snippet de code principal est le fichier entier. J'ai ajouté une description du code à ma réponse, pour faciliter aux lecteurs de décider s'il convient à leur cas d'utilisation.

0voto

Plus récemment, j'ai eu un cas d'utilisation similaire où je souhaitais extraire sélectivement du contenu d'un gros fichier zip dans le cloud, et j'ai trouvé une autre technique qui se résume à :

  • Monter le fichier zip distant dans le système de fichiers (la technique peut varier en fonction des caractéristiques du fichier distant). Important - cette technique de montage doit permettre un accès aléatoire au fichier distant (recherche).
  • Se fier aux outils zip standard (comme unzip) pour analyser le fichier et effectuer des opérations (y compris l'extraction des fichiers au fur et à mesure de leur arrivée via le tube).

Cette approche nécessite toujours des modifications du système de fichiers local (création d'un montage), mais pourrait être utilisée pour décompresser des fichiers alors qu'ils sont diffusés sur le réseau.

En théorie, il devrait être possible de mettre en œuvre quelque chose de similaire en utilisant des requêtes de plage HTTP pour effectuer des opérations de décompression incrémentielles ou sélectives sur un fichier zip hébergé en HTTP.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X