Linux / Commande unzip : inspecter un ZIP et extraire sans écrasement imprévu
unzip liste, teste et extrait les fichiers d’une archive ZIP. Avant d’écrire les fichiers, inspectez les chemins avec -l, testez les données avec -t et choisissez une destination distincte avec -d. -n saute les fichiers déjà présents ; -o les écrase sans demander de confirmation.
Lire la liste et tester avant d’extraire
Les exemples utilisent Info-ZIP UnZip. Consultez unzip -v et man unzip pour l’implémentation installée. Sans destination explicite, l’extraction se fait dans le répertoire courant et ses sous-répertoires :
unzip [OPTIONS] ARCHIVE.zip [MEMBRE ...] [-d DESTINATION]
Pour une archive project.zip que vous avez reçue, commencez par ces opérations de consultation :
unzip -l project.zip
unzip -Z -1 project.zip
unzip -t project.zip
-l affiche les noms, tailles décompressées et dates. -Z passe en mode ZipInfo et -1 demande seulement les noms, un par ligne. -t décompresse les entrées en mémoire et compare leur contrôle de redondance cyclique, ou CRC, au contrôle enregistré ; il n’écrit pas les fichiers extraits.
Une liste lisible n’est pas une preuve que toutes les données sont intactes. Inversement, un test réussi ne prouve ni l’origine ni l’innocuité des documents. Examinez les chemins, les types d’entrées et l’espace nécessaire : la taille totale décompressée peut dépasser largement celle du ZIP. Une méthode de compression ou de chiffrement non prise en charge demande un outil compatible ; renommer l’archive ne change pas son format.
Suivre un exemple complet avec une destination neuve
Pour disposer d’une archive connue, installez aussi le programme zip si nécessaire. Dans Bash, préparez un dossier temporaire avec deux textes et une destination encore vide :
demo=$(mktemp -d) &&
cd "$demo" &&
mkdir -p docs/sub restore &&
printf 'readme\n' > docs/readme.txt &&
printf 'notes\n' > docs/sub/notes.txt &&
zip -r bundle.zip docs/ &&
printf 'Repertoire de travail : %s\n' "$demo"
Poursuivez uniquement si chaque commande réussit et restez dans ce terminal. Le chemin affiché permet de retrouver l’essai. Inspectez puis testez votre archive avant de restaurer :
unzip -Z -1 bundle.zip
unzip -t bundle.zip
La liste doit inclure docs/readme.txt et docs/sub/notes.txt, ainsi que les entrées de répertoires ajoutées par zip. L’ordre n’est pas un critère d’intégrité. Après un test réussi :
unzip bundle.zip -d restore/ &&
cmp docs/readme.txt restore/docs/readme.txt &&
cmp docs/sub/notes.txt restore/docs/sub/notes.txt &&
printf 'Restauration identique\n'
Le résultat est restore/docs/readme.txt et restore/docs/sub/notes.txt, car docs/ fait partie des chemins stockés. cmp est normalement silencieux et renvoie 0 si les octets sont identiques. Le message final dépend du succès de l’extraction et des deux comparaisons ; un simple fichier présent après une erreur peut être incomplet.
Sur un vrai dossier, mkdir -p restore ne garantit pas que restore est vide : il peut déjà contenir des fichiers. L’exemple évite cela grâce au dossier temporaire neuf. Choisissez de même une destination nouvelle pour une archive réelle ; un dossier distinct limite les collisions mais n’est pas une isolation complète contre un contenu malveillant.
Décider du comportement sur les fichiers existants
| Choix | Comportement |
|---|---|
| Sans -n ni -o | Demander normalement une décision avant le remplacement d’un fichier existant. |
| -n | Sauter les fichiers existants sans poser de question. |
| -o | Écraser sans confirmation. |
| -d dossier | Choisir le répertoire de base pour les chemins extraits. |
unzip -n bundle.zip -d restore/
Dans notre essai, les fichiers déjà restaurés sont conservés. -n ne compare pas leurs octets avec l’archive et ne les met pas à jour : une ancienne version restera une ancienne version. Une extraction dans un dossier contenant déjà des documents peut donc produire un mélange de versions même sans écrasement.
Si un remplacement est réellement nécessaire, conservez d’abord la version existante et vérifiez la sélection d’entrées et la destination. N’ajoutez pas -o dans un script simplement pour éviter une question inattendue. Pour une archive non fiable, évitez les droits administrateur et examinez aussi les liens ; n’activez pas des options qui rétablissent l’écriture vers des chemins parents.
Sélectionner une entrée et préserver les chemins utiles
Il est possible d’extraire seulement un membre dont le nom a été lu dans la liste. Dans le dossier de l’essai, choisissez une nouvelle destination :
mkdir selected &&
unzip bundle.zip 'docs/readme.txt' -d selected/ &&
cmp docs/readme.txt selected/docs/readme.txt
Le chemin doit correspondre au nom enregistré dans l’archive. Si vous utilisez un motif, placez-le entre guillemets ou apostrophes pour que le shell ne le développe pas sur les fichiers du dossier courant. -j supprime les chemins lors de l’extraction ; cela peut créer des collisions entre des fichiers de sous-dossiers différents qui portent le même nom. Garder la structure est plus clair dans cet exemple.
-p peut envoyer les octets d’une entrée sur la sortie standard sans créer son chemin. Limitez la sélection à ce que vous voulez réellement lire et évitez d’afficher un contenu binaire inconnu au terminal. Toute redirection > demande aussi un nom libre, car le shell peut tronquer une destination existante.
Le manuel Info-ZIP UnZip fourni par Ubuntu 26.04 LTS précise les options de sélection, les contrôles et les diagnostics. Le guide de création ZIP et de vérification des exclusions explique comment construire un paquet avec les chemins attendus. Pour un échange entre plateformes, vérifiez aussi les noms accentués et les métadonnées nécessaires : des octets de contenu identiques ne suffisent pas à valider toutes les permissions ou tous les propriétaires.




