Comment rediriger la sortie de wget comme entrée pour décompresser?

Je dois télécharger un fichier à partir de ce lien . Le téléchargement du fichier est un fichier zip que je devrai décompresser dans le dossier actuel.

Normalement, je le téléchargerais dabord, puis jexécuterais la commande unzip.

$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip $ unzip temp.zip 

Mais de cette façon, je dois exécuter deux commandes, attendre la fin de la première pour exécuter la suivante, aussi, je dois connaître le nom du fichier temp.zip pour le donner à unzip.

Est-il possible de rediriger la sortie de wget vers unzip? Quelque chose comme

$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834` 

Mais cela na pas fonctionné.

bash: wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip: redirection ambiguë

De plus, wget a été exécuté deux fois , et téléchargé le fichier deux fois.

Commentaires

  • Dans le dernier exemple, wget a probablement été exécuté deux fois car le? est un caractère spécial dans le shell . Mettre lURL dans  »  » s devrait aider.
  • Ce fil semble avoir une solution. Haven ‘ Jai bien essayé moi-même. serverfault.com/questions/26474/…

Réponse

Vous devez télécharger vos fichiers dans un fichier temporaire, car (en citant la décompression man page):

Les archives lues à partir de lentrée standard ne sont pas encore prises en charge, sauf avec funzip (et seulement le premier m embre de larchive peut être extrait).

Il suffit de rassembler les commandes:

wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip unzip temp.zip rm temp.zip 

Mais afin de le rendre plus flexible, vous devriez probablement le mettre dans un script afin de sauvegarder un peu de frappe et pour vous assurer de ne pas écraser accidentellement quelque chose, vous pouvez utiliser le mktemp pour créer un nom de fichier sûr pour votre fichier temporaire:

#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE 

Commentaires

  • Est wget file.zip && unzip file.zip identique à wget file.zip; unzip file.zip ou lun est-il préférable à lautre? Merci 🙂
  • @NextLocal wget && unzip ne lancera la décompression que si wget réussit. wget ; unzip lancera de toute façon unzip, pointant peut-être vers un fichier inexistant.
  • funzip était la réponse que je cherchais. Terraform (pour une raison quelconque) empaquette le binaire ‘ sous forme de fichier unique dans une archive zip, donc cétait parfait pour moi.

Réponse

Ceci est un republication de ma réponse à une question similaire:

Le format de fichier ZIP comprend un répertoire (index) à la fin de larchive. Ce répertoire indique où, dans larchive, chaque fichier est situé et permet ainsi un accès rapide et aléatoire, sans lire lintégralité de larchive.

Cela semble poser un problème lors de la tentative de lecture dune archive ZIP via un pipe, en ce que lindex nest accessible quà la toute fin et que les membres individuels ne peuvent donc pas être extraits correctement tant que le fichier na pas été entièrement lu et nest plus disponible. En tant que tel, il nest pas surprenant que la plupart des décompresseurs ZIP échouent simplement lorsque larchive est fournie via un tube.

Le répertoire à la fin de larchive nest pas le seul emplacement où le fichier meta les informations sont stockées dans larchive. En outre, 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 nutilisent pas les en-têtes de fichiers locaux lorsque lindex nest pas disponible, les frontaux tar et cpio de libarchive (alias bsdtar et bsdcpio) peuvent et le feront quand lire à travers un tube, ce qui signifie que ce qui suit est possible:

wget -qO- http://example.org/file.zip | bsdtar -xvf- 

Commentaires

  • Cest excellent ! Je voudrais noter que tar me donne quelques avertissements sur la taille des données non compressées (attendue 0), mais les fichiers eux-mêmes semblent ne pas être endommagés. Je suppose que cela est dû à labsence dindex.
  • Jai ici un .zip -fichier qui contient des fichiers avec des autorisations exécutables. Lorsque je télécharge et redirige vers bsdtar, les bits dexécution sont jetés. Lorsque je télécharge sur disque et extrait avec bsdtar ou unzip alors, les bits dexécution sont honorés.
  • // , @GolarRamblar, avez-vous déjà découvert pourquoi?
  • @NathanBasanese: ici est la réponse. En bref: une archive ZIP a deux emplacements où elle stocke ces informations, qui peuvent être incohérentes, et selon que le fichier bsdtar souvre est recherché ou non, il utilise lun ou lautre endroit .

Réponse

Si vous avez installé le JDK, vous pouvez utiliser jar:

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin 

Commentaires

  • Je viens de trouver que jar ne ‘ ne conserve pas les droits daccès aux fichiers. Belle astuce sinon.
  • Vous navez ‘ pas besoin de donner un paramètre de fichier, utilisez simplement | jar xv
  • Moi aussi, jai été mordu par lhypothèse que jar pourrait être utilisé en remplacement de unzip; Malheureusement, jar ne restaure pas les fichiers extraits ‘ autorisations;
  • Utilisez simplement | jar x
  • jar est beaucoup plus agréable à gérer les noms de fichiers UTF-8. unzip choses mutilées.

Réponse

Je ne « t pensez même que vous voulez même déranger la sortie de wget dans unzip.

De larticle wikipedia « ZIP (format de fichier) » :

Un fichier ZIP est identifié par la présence dun répertoire central situé à la fin du fichier.

wget doit terminer complètement le téléchargement avant que la décompression ne puisse faire quelque travail que ce soit, donc ils sexécutent séquentiellement, pas entrelacés comme on pourrait le penser.

Réponse

Republication de ma réponse :

BusyBox « s unzip 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 consiste à utiliser stdin comme entrée.

Vous pouvez même,

cat file.zip | busybox unzip - 

Mais cela « est juste redondant de unzip file.zip.

Si votre distribution utilise BusyBo x par défaut (par exemple Alpine), exécutez simplement unzip -.

Commentaires

  • suite à @Saftever ‘ s réponse, sur laquelle je ‘ ne suis pas autorisé à commenter, busybox fonctionnera mais les versions antérieures à 1.27.0 ont gagné ‘ t en raison dun lseek redondant, consultez le journal des modifications busybox.net

Réponse

La syntaxe correcte serait:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip) 

mais cela ne fonctionnera pas, à cause de lerreur ( Info-ZIP sur Debian ):

lseek(3, 0, SEEK_SET) = -1 ESPIPE (Illegal seek) Archive: /dev/fd/63 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of /dev/fd/63 or /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period. 

ou sur BSD / OS X:

Trying to read large file (> 2 GiB) without large file support 

Cest parce que les outils zip standard utilisent principalement lseek fonction afin de définir le décalage du fichier à la fin pour lire son enregistrement de fin de répertoire central . Il est situé à la fin de la structure de larchive et il est nécessaire de lire la liste des fichiers (voir: Structure du format de fichier Zip ). Par conséquent, le fichier ne peut pas être FIFO, pipe, terminal ou toute autre dynamique, car lobjet dentrée ne peut pas être positionné par la fonction lseek.

Vous avez donc le solutions de contournement suivantes:

  • utilisez un type de compression différent (par exemple tar.gz),
  • vous devez utiliser deux commandes distinctes,
  • utiliser des outils alternatifs (comme suggéré dans dautres réponses),
  • créer un alias ou une fonction pour utiliser plusieurs commandes.

Commentaires

  • Je pense que cela pourrait être encore un FIFO. Il vous suffit de ‘ de continuer à lire depuis le FIFO jusquà EOF (en mettant en mémoire tampon tout le FIFO en mémoire ou dans un fichier temporaire). Tout à fait faisable pour faciliter la création de scripts, mais pas très utile.

Réponse

Sil ny a quun seul fichier dans zip, vous pouvez utiliser zcat ou gunzip:

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip 

FYI: Voici les définitions de gunzip et zcat sur mon système:

$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@" 

Réponse

Une archive zip nest pas séquentielle car elle contient souvent la table des matières à la fin du fichier, il est donc difficile de le décompresser en streaming.

Une autre solution consiste à voir si vous pouvez obtenir un autre format de fichier, comme .tar.gz.

Par exemple, si vous « téléchargez un fichier .zip à partir de GitHub, il y a presque toujours un .tar.gz version disponible.

Par exemple,

Notez le modèle – remplacez simplement .zip par .tar.gz et dirigez vers | tar xzf -

Réponse

Cela fonctionne assez bien pour moi:

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -  

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *