Extraire uniquement un fichier spécifique d'une archive compressée dans un répertoire donné

152

J'ai besoin d'extraire un seul fichier d'un fichier ZIP dont je connais le chemin. Existe-t-il une commande semblable à celle-ci:

unzip -d . myarchive.zip path/to/zipped/file.txt

Malheureusement, la commande ci-dessus extrait et recrée le chemin d'accès complet au fichier ./path/to/zipped/file.txt. Y at-il un moyen pour moi de simplement extraire le fichier dans un répertoire spécifié?

Naftuli Kay
la source

Réponses:

130

Vous pouvez extraire uniquement le texte en sortie standard avec l' -poption:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

Cela n'extrait pas les métadonnées (date, autorisations,…), mais uniquement le contenu du fichier. C'est le prix à payer pour la commodité de ne pas avoir à déplacer le fichier par la suite.

Sinon, montez l'archive en tant que répertoire et copiez simplement le fichier. Avec AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

Ou avec fusible-zip :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d
Gilles
la source
2
@TK Kocheran: Pourquoi ne pas simplement le tester? J'ai testé la première commande, et cela a fonctionné.
utilisateur inconnu
1
@TKKocheran: Les fichiers Jar sont des zips, les méthodes de décompression et de fusion-zip fonctionneront évidemment. La méthode AVFS fonctionne également, car AVFS détermine le format en fonction des noms de fichiers et en a connaissance .jar. Si votre fichier porte un nom différent, vous devrez peut-être indiquer à AVFS d'utiliser son gestionnaire zip, par exemple ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles
1
en fait, je voulais dire extraire un fichier JAR / binaire à partir d’une archive ZIP. Je n'ai pas encore eu l'occasion de le tester. Pouvez-vous déceler des problèmes lors de l'utilisation de la première commande ci-dessus pour extraire des fichiers binaires?
Naftuli Kay
2
@TKKocheran: Il n'y a pas de problème, -pextrait le fichier tel -cquel ( conversion de texte).
Gilles
2
Je pense que la réponse de @Myles est plus élégante, car elle ne nécessite pas de redirection de sortie et préserve les attributs de fichier.
gertvdijk
153
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Entrez le chemin complet du fichier compressé, pas seulement le nom du fichier. Assurez-vous de conserver la structure vue depuis le fichier zip.

Cela va extraire le fichier unique file.txtdans myarchive.zipla /path/to/unzip/to/file.txt.

sMyles
la source
18
C'est la meilleure réponse.
Redburn
1
Il ne gère pas le cas où vous souhaitez que le nom de fichier généré soit différent.
Oleg Vaskevich
6
le paramètre "-j": chemins d'accès indésirables. La structure de répertoire de l'archive n'est pas recréée; tous les fichiers sont déposés dans le répertoire d’extraction (par défaut, le répertoire actuel). le paramètre "-d": extrait les fichiers dans exdir
e1i45
1
@OlegVaskevich, la question ne demande pas que le nom de fichier cible soit différent
Tapemaster
Ouais je sais. Toujours voté. :)
Oleg Vaskevich
25

Version simplifiée:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Cela recréera PATH_OF_FILE_INSIDE_ARCHIVEdans le répertoire courant mais extraira uniquement le fichier spécifié.

Pour lister tous les fichiers d’une archive Zip:

unzip -l ARCHIVE_NAME
Taukir
la source
2
Beaucoup plus simple que la réponse acceptée.
FractalSpace
En effet, a bien fonctionné et c’est plus simple maintenant
Mahmoud Ali
2

Sur macOS , qui utilise par défaut Info-Zip

Première liste des fichiers pour trouver ce que vous voulez

unzip -l my.zip

Ensuite, fournissez une liste de fichiers à extraire de l'archive

unzip my.zip annoying/path/to/file

Combiner avec -p pour stdout

unzip -p my.zip annoying/path/to/file >./file
Cameron Lowell Palmer
la source
1
Je ne comprends pas pourquoi les gens votent sans raison évidente. Ceci est une réponse correcte (et pas seulement pour macOS)
FractalSpace
@FractalSpace Ce n'est évidemment pas le cas, c'est le contraire de ce que veut OP.
Konrad Rudolph Le
La clé est d'obtenir un fichier individuel. La sortie sur stdout et la redirection à l'aide de l'indicateur -p sont triviales, mais je les ai ajoutées explicitement
Cameron Lowell Palmer
2

utilisation simple:

unzip zipfile.zip path/inside/zip/file.txt

et cela gonflera le fichier.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php
Cesar Alejandro Bravo Anaya
la source
Peut aussi ajouter l' -d outpathargument pour spécifier où le fichier est placé.
Efren
Et l' -jargument pour éviter les chemins compressés
Efren le