Je dois télécharger un fichier à partir de ce lien . Le téléchargement de fichier est un fichier zip que je devrai décompresser dans le dossier actuel.
Normalement, je le téléchargerais d'abord, puis lancerais 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, de plus, je dois connaître le nom du fichier temp.zip
auquel 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 ça n'a pas marché.
bash::
wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip
redirection ambiguë
En outre, a wget
été exécuté deux fois et téléchargé le fichier deux fois.
command-line
io-redirection
Andrew-Dufresne
la source
la source
Réponses:
Vous devez télécharger vos fichiers dans un fichier temporaire, car (en citant la page de manuel unzip):
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 une frappe et pour vous assurer de ne pas écraser accidentellement quelque chose, vous pouvez utiliser la
mktemp
commande pour créer un nom de fichier sûr pour votre fichier temporaire:la source
wget file.zip && unzip file.zip
la même chosewget file.zip; unzip file.zip
ou est-ce que l'un est préféré à l'autre? Merci :)wget && unzip
le décompression que si wget a réussi.wget ; unzip
fonctionnera quand même unzip, pointant éventuellement sur un fichier inexistant.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 toute l’archive.
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
.zip
fichier ici qui contient des fichiers avec des autorisations exécutables. Lorsque je télécharge et que je me connectebsdtar
, les bits d’exécution sont jetés. Lorsque je télécharge sur le disque et que j'extrais avecbsdtar
ouunzip
ensuite, les bits d'exécution sont respectés.bsdtar
s'ouvre est consultable ou non, il utilise l'un ou l'autre endroit.Si vous avez le JDK installé, vous pouvez utiliser
jar
:la source
jar
cela ne préserve pas les autorisations de fichiers. Belle astuce sinon.| jar xv
Je ne pense pas que vous vouliez même déranger la sortie de wget dans unzip.
Extrait de l'article wikipedia "ZIP (format de fichier)" :
wget doit terminer complètement le téléchargement avant de pouvoir décompresser un fichier, il doit donc être exécuté de manière séquentielle et non imbriquée comme on pourrait le penser.
la source
La syntaxe appropriée serait:
mais cela ne fonctionnera pas, à cause de l'erreur ( Info-ZIP sur Debian ):
ou sur BSD / OS X:
En effet, les outils de compression standard utilisent principalement des
lseek
fonctions afin de définir le décalage du fichier à la fin pour lire son enregistrement de fin de répertoire central . Il se trouve à la fin de la structure de l'archive 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 une FIFO, un canal, un périphérique terminal ou toute autre dynamique, car l'objet en entrée ne peut pas être positionné par lalseek
fonction.Donc, vous avez les solutions de contournement suivantes:
tar.gz
),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
Cela fonctionne très bien pour moi:
la source