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 versbsdtar
, les bits dexécution sont jetés. Lorsque je télécharge sur disque et extrait avecbsdtar
ouunzip
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 deunzip
; 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,
- https://github.com/madler/zlib/archive/v1.2.11.zip
- https://github.com/madler/zlib/archive/v1.2.11.tar.gz
- https://github.com/curl/curl/archive/curl-7_68_0.zip
- https://github.com/curl/curl/archive/curl-7_68_0.tar.gz
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 -