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é?

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

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.


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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.