Puis-je faire en sorte qu'unzip ou un programme similaire fonctionne 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 lié: comment diriger un fichier téléchargé vers une sortie standard dans bash?
linux
ubuntu
pipe
compression
Alex
la source
la source
Réponses:
Bien qu'un fichier zip soit en fait un format conteneur, il n'y a aucune raison pour qu'il ne puisse pas être lu à partir d'un tube (stdin) si le fichier peut tenir dans la mémoire assez facilement. Voici un script Python qui prend un fichier zip en entrée standard et en extrait le contenu dans le répertoire actuel ou dans un répertoire spécifié, le cas échéant.
Ce script peut être réduit à une ligne et créé comme un alias.
Décompressez maintenant facilement la sortie de wget.
la source
.read()
méthodeIl est peu probable que cela fonctionne comme vous le souhaitez. Zip n'est pas simplement un format de compression, mais aussi un format de conteneur. Il regroupe les travaux de tar et de gzip.bzip2. Cela dit, si votre zip ne contient qu'un seul fichier, vous pouvez utiliser unzip -p pour extraire les fichiers sur la sortie standard. Si vous avez plus d'un fichier, vous n'avez aucun moyen de dire où ils commencent et s'arrêtent.
Pour ce qui est de stdin, la page de manuel unzip contient la phrase suivante:
Vous pourriez avoir un peu de chance avec funzip.
la source
Ce que vous voulez faire est de faire
unzip
prendre un fichier ZIPped sur son entrée standard plutôt qu’en argument. Cela est généralement facilement pris en charge pargzip
ettar
type d'outils avec un-
argument. Mais la normeunzip
ne le fait pas (cependant, elle supporte l'extraction vers un tuyau). Cependant, tout n'est pas perdu...Regardez la page de manuel de funzip .
Cela va bien avec l'idée que la plupart des archives Linux sont habituellement TAR'ed, puis ZIPped d'une manière ou d'une autre (gzip, bzip, et autres). Cela fonctionnera pour vous si vous avez un
tar.ZIP
.Il est à noter que
funzip
c'est écrit par l'auteur original d'Info-ZIP, Mark Adler. Il écrit dans la page de manuel funzip,Cependant, aucune mise à jour de ce type n'est visible. Je soupçonne que Mark l’a trouvé inutile étant donné que d’autres méthodes d’archivage fonctionnent facilement avec TAR.
la source
J'aime utiliser curl car il est installé par défaut (
-L
c'est nécessaire pour les redirections qui se produisent souvent):Cependant,
bsdtar
n’est pas installé par défaut et je n’ai pas pu me mettrefunzip
au travail.la source
Voici un extrait de ma réponse à une question similaire:
Le format de fichier ZIP comprend un répertoire (index) à la fin de l'archive. Ce répertoire indique où, dans l’archive, se trouve chaque fichier et permet ainsi un accès rapide et aléatoire, sans lire l’archive complète.
Cela semblerait poser un problème lors de la tentative de lecture d'une archive ZIP par un canal, dans la mesure où l'index n'est accessible qu'à la toute fin et que les membres individuels ne peuvent donc pas être extraits correctement avant la lecture complète du fichier et sa non disponibilité. . 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 tube.
Le répertoire à la fin de l'archive n'est pas le seul emplacement où les méta-informations de 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 versions de tar et cpio se terminant par libarchive (alias bsdtar et bsdcpio) peuvent et le feront lors de la lecture via un canal, ce qui signifie que:
la source
Ce n'est pas possible avec Info-Zip, qui est l'implémentation OSS la plus courante. Plus important encore, ce n'est pas recommandé en raison de la structure des archives ZIP.
Si un changement de format est viable pour vous, envisagez plutôt d'utiliser tar (1). Il est assez satisfait des entrées / sorties en flux et l’attend en fait par défaut.
De plus, vous pouvez souvent savoir si les applications attendent des entrées / sorties en streaming en spécifiant "-" pour un nom de fichier. Comme vous pouvez l'imaginer, Info-Zip ne considère pas cela comme un argument valable.
la source
En zsh, vous pouvez effectuer les opérations suivantes:
la source
L'utilitaire commun le plus simple disponible à cet effet est
jar
, ce qui présume que STDIN est utilisé si vous ne lui transmettez pas d'argument de fichier. Il faut également des arguments similaires autar
programme pour les opérations.par exemple, lister le contenu d'une archive
curl https://my.example.com/file.zip | jar t
Bien que Java ne soit pas toujours installé,
jar
la méthode la plus pratique est certainement celle qui s’y trouve.la source
Repost de ma réponse :
BusyBox
unzip
peut prendre stdin et extraire tous les fichiers.Le tiret suivant
unzip
consiste à utiliser stdin en tant qu'entrée.Vous pouvez même,
Mais c'est juste redondant de
unzip file.zip
.Si votre distribution utilise BusyBox par défaut (par exemple, Alpine), lancez simplement
unzip -
.la source
En fait, j'avais besoin de quelque chose d'un peu plus complexe - extraire un fichier spécifique s'il existe. La difficulté étant que le flux de fichier d'entrée ne soit peut-être pas un fichier zip, et dans ce cas, je l'avais besoin pour continuer à travers le tuyau. Voici ma solution (principalement grâce à la solution Jason R. Coombs)
J'ai sauvegardé ceci en tant que fichier nommé "effpoptp" (pas un nom simple) dans le dossier "/ bin" sur ma machine, donc le tester ressemble à ça:
Le but est de contrôler la version des fichiers MySQL Workbench, le fichier pouvant être le fichier xml nommé comme fichier de plan de travail ou le fichier de plan de travail complet.
la source