Extraire un fichier ou un dossier d’une archive tar.gz

tar xf sauvegarde.tar.gz site/uploads n’écrit que les membres de ce dossier et laisse le reste de l’archive sur le disque. Le chemin se copie tel que tar tf l’affiche, sinon la commande s’arrête sur tar: uploads: Not found in archive. Deux options y suffisent, -x et -f, sur une machine Linux sous Debian 12 ou Ubuntu 24.04.
Sommaire
- Deux options tar suffisent : -x extrait, -f désigne l’archive
- Le nom exact se lit dans la sortie de tar tf
- Le message Not found in archive désigne un nom absent, pas une archive abîmée
- Un joker dans le nom demande –wildcards sous GNU tar
- -C déplace la destination, –strip-components coupe les dossiers de tête
- L’extraction économise l’écriture, pas la traversée de l’archive
- Le tube, la destination et l’arrêt anticipé changent la commande
- Sources
Deux options tar suffisent : -x extrait, -f désigne l’archive
GNU tar sort un dossier précis d’une archive avec deux options, -x pour l’extraction et -f pour désigner le fichier d’archive. Le reste tient dans l’argument suivant, le chemin du dossier tel qu’il est stocké. GNU tar 1.34 sous Debian 12 et tar 1.35 sous Ubuntu 24.04 LTS appliquent la même règle ; l’annonce info-gnu date la sortie de tar 1.35 du 18 juillet 2023, et le manuel GNU tar précise que la reconnaissance du format compressé est automatique à la lecture : -z reste facultatif devant un fichier ordinaire. L’option -v affiche chaque membre écrit, un chemin par ligne. Le manuel note que tar crée les sous-dossiers manquants lorsqu’un membre stocké porte un chemin plus profond que le dossier courant. Un dossier nommé sans joker emporte tout ce qui se trouve sous lui dans l’archive, entrées de répertoire comprises, et rien d’autre n’est écrit sur le disque.
Lister l’archive avant de la manipuler évite la plupart des échecs, car un préfixe oublié suffit à faire échouer une extraction écrite correctement.
tar -xvf sauvegarde.tar.gz site/uploads
site/uploads/
site/uploads/logo.webp
site/uploads/photos/
site/uploads/photos/bretagne.jpg
Chaque ligne de cette sortie correspond à un membre écrit, dans l’ordre de parcours de l’archive.
| Sélection | Commande | Nombre d’options tar | Membres écrits sur le disque |
|---|---|---|---|
| Un dossier et son contenu | tar -xf sauvegarde.tar.gz site/uploads |
2 | Les membres de site/uploads, seuls |
| Le contenu sans le dossier parent | tar -xf sauvegarde.tar.gz --strip-components=1 site/uploads |
3 | Les mêmes, un niveau plus haut |
| Certains fichiers d’un dossier | tar -xf sauvegarde.tar.gz --wildcards 'site/uploads/*.webp' |
3 | Les fichiers webp du dossier |
| Un fichier unique | tar -xf sauvegarde.tar.gz site/uploads/logo.webp |
2 | Ce fichier |
Le nom exact se lit dans la sortie de tar tf
Les noms des membres se lisent avec tar tf, et cette liste fait foi pour l’extraction. La commande tar tf sauvegarde.tar.gz combine -t, qui liste, et -f, qui désigne l’archive ; sa sortie se filtre avec grep pour isoler un dossier au milieu de milliers de lignes. GNU tar compare les noms d’inclusion littéralement par défaut, règle énoncée dans la section du manuel consacrée au contrôle des motifs, et les exemples officiels insistent sur le même point : le membre se nomme exactement comme la liste l’imprime. Un préfixe ./ ou un dossier parent comme site/ appartient au nom, pas à la décoration. La page de manuel FreeBSD de bsdtar signale que son implémentation retire toujours un ./ de tête à la création, alors que GNU tar conserve le nom reçu, d’où deux archives identiques aux noms de membres différents.
Un préfixe oublié ou une majuscule suffit à rompre la correspondance, et extraire un fichier d’une archive tar.gz ramène toujours à cette chaîne exacte.
tar -tf sauvegarde.tar.gz | grep -F uploads
./site/uploads/
./site/uploads/logo.webp
./site/uploads/photos/bretagne.jpg
Dans la liste affichée, ./site/uploads est un seul nom ; l’extraction le réclame complet, jamais réduit à uploads.
Le message Not found in archive désigne un nom absent, pas une archive abîmée
Le message tar: uploads: Not found in archive signale un nom absent, jamais une archive abîmée, et le manuel GNU tar le range dans sa section des commandes qui échouent. Trois causes couvrent la plupart des cas. Le nom stocké commence par ./ ou par un dossier parent que la commande a retiré, et la comparaison littérale échoue sur cette différence. Un motif avec étoile a été écrit sans –wildcards, si bien que le caractère a été cherché tel quel dans les noms. L’archive ne contient aucune entrée pour le dossier lui-même, uniquement ses fichiers, cas fréquent des archives construites fichier par fichier. La sortie de tar tf tranche en affichant la chaîne exacte, et tar termine avec le code de retour 2, que la page de manuel Debian classe parmi les erreurs fatales. Recopier la chaîne exacte, préfixe compris, corrige la commande.
tar -xf sauvegarde.tar.gz uploads
tar: uploads: Not found in archive
Un script shell peut tester echo $? avant d’enchaîner, car le code 2 distingue l’échec de nom d’une extraction réussie.
Un joker dans le nom demande –wildcards sous GNU tar
Sous GNU tar, un motif avec étoile exige –wildcards, alors que d’autres implémentations s’en passent. Les noms d’inclusion sont comparés littéralement par défaut et les jokers restent réservés aux exclusions, règle résumée par la page de manuel Debian sous la mention default for exclusion. Il faut donc placer –wildcards avant le motif, entre guillemets pour que le shell ne l’étende pas avant l’appel. Le manuel GNU tar précise que l’étoile peut couvrir le caractère /, ce qui permet à un motif comme site/uploads/* de viser fichiers et sous-dossiers d’un coup. La page de manuel FreeBSD de bsdtar décrit l’inverse pour son implémentation : les noms passés à l’extraction sont des motifs shell dès le départ, sans option. Une commande écrite pour Debian se teste donc avant d’être recopiée sur macOS ou FreeBSD.
Sans l’option, GNU tar cherche l’étoile dans les noms et conclut au même Not found in archive que pour un dossier absent.
tar -xvf sauvegarde.tar.gz --wildcards 'site/uploads/*.webp'
site/uploads/logo.webp
site/uploads/photos/bretagne.webp
-C déplace la destination, –strip-components coupe les dossiers de tête
L’extraction écrit dans le dossier courant, sauf indication contraire, et deux options déplacent le résultat ailleurs. L’option -C change de répertoire avant l’extraction des membres, pouvoir décrit par la page de manuel Debian, qui signale aussi son caractère sensible à l’ordre : tout ce qui suit dans la ligne de commande en hérite. La seconde, –strip-components=NUMBER, retire les premiers éléments du chemin des membres, avec la même source. Les deux se combinent pour déposer un dossier nu dans une destination choisie, par exemple sous /srv. Une limite propre à la découpe apparaît dans la page de manuel FreeBSD de bsdtar : les chemins plus courts que le nombre demandé sont ignorés en silence, sans message ni erreur. Le résultat d’une sélection limitée à site/uploads suivie de –strip-components=1 tient donc dans uploads/, et rien de site/index.php n’apparaît.
Sans découpe, la copie se retrouve sous /srv/site/uploads/, avec les deux niveaux recréés par tar.
tar -xf sauvegarde.tar.gz -C /srv --strip-components=1 site/uploads
ls /srv/uploads
logo.webp photos
Sous Windows, 7-Zip ouvre le .tar.gz en deux passes et laisse extraire le seul dossier voulu à la souris, sans ligne de commande, comme le détaille la prise en main de 7-Zip.
L’extraction économise l’écriture, pas la traversée de l’archive
Le gain d’une extraction ciblée porte sur le disque, pas sur la lecture. Un tar déroule l’archive membre après membre, dans l’ordre de création, et la page de manuel FreeBSD de bsdtar énonce la règle par défaut de son implémentation : l’archive est toujours lue jusqu’à la fin, plusieurs entrées pouvant porter le même nom. GNU tar ne saute pas vers un membre précis ; l’option –occurrence, décrite par la page de manuel Debian, fixe seulement le nombre d’occurrences traitées par nom, et elle n’agit qu’avec –extract, –list, –diff ou –delete quand une liste de noms est fournie. Un dossier rangé loin dans une grosse archive se paie donc en traversée complète, même si une fraction seulement finit sur le disque. Copier ce dossier une fois puis le recompresser à part reste la sortie la plus rapide lorsque l’archive est relue souvent.
Le tube, la destination et l’arrêt anticipé changent la commande
La méthode gzip -d puis tar coûte-t-elle plus que tar xf ?
Oui, en espace disque : la page de manuel gzip décrit gunzip comme remplaçant chaque fichier .gz par sa version décompressée, ici le .tar complet, et l’option -k garde le fichier d’origine. L’extraction directe, tar xf sauvegarde.tar.gz site/uploads, évite cette copie intermédiaire. Ne décompresser l’archive entière que si elle doit être relue en clair.
Faut-il garder -z dans la commande d’extraction ?
Sur un fichier ordinaire, non : le manuel GNU tar indique que les signatures puis le suffixe suffisent à reconnaître la compression, et qu’une option de décompression ne devient nécessaire que sur un tube. Un tube produit alors le message documenté tar: Archive is compressed. Use -z option, suivi de tar: Error is not recoverable: exiting now. La variante qui fonctionne s’écrit cat sauvegarde.tar.gz | tar xzf – ; garder -z partout reste sans danger.
Comment extraire le dossier directement sous /srv ?
Deux options se combinent : -C /srv place l’extraction dans ce répertoire, et –strip-components=1 retire le premier élément du chemin des membres. Écrite ainsi, tar -xf sauvegarde.tar.gz -C /srv –strip-components=1 site/uploads dépose uploads/ et son contenu directement sous /srv. Le caractère sensible à l’ordre de -C, rappelé par la page de manuel Debian, impose de le placer avant les noms de membres ; les chemins trop courts pour la découpe sont ignorés sans message, selon la page de manuel FreeBSD de bsdtar.
Que remplace une extraction lorsque le dossier existe déjà ?
Le manuel GNU tar prévient que les fichiers extraits écrasent ceux du même nom, y compris lorsque la copie locale est plus récente. L’option -k, documentée sous le nom –keep-old-files par la page de manuel Debian, bloque ce remplacement et saute les fichiers existants. Pour comparer avant d’écraser, une extraction dans un répertoire vide via -C reste le geste le plus sûr.
Deux copies du même dossier dorment dans l’archive, laquelle sort ?
Par convention, la dernière copie l’emporte : la page de manuel FreeBSD de bsdtar documente que les entrées lues plus loin écrasent les précédentes. L’option –occurrence=1, décrite par la page de manuel Debian, traite la première occurrence de chaque nom listé et ignore les suivantes. Elle exige une liste de noms sur la ligne de commande ou lue avec -T, et ne fonctionne qu’avec –extract, –list, –diff ou –delete. La commande tar -xf sauvegarde.tar.gz –occurrence=1 site/uploads sort donc la première version du dossier.
Sources
- Manuel GNU tar, GNU Project : reconnaissance de la compression, contrôle des motifs, commandes qui échouent.
- tar(1), page de manuel Debian bookworm, paquet tar 1.34+dfsg-1.2+deb12u1 : –wildcards, –occurrence, –strip-components, -C, code de retour 2.
- tar(1), page de manuel FreeBSD 15.1, bsdtar et libarchive : motifs par défaut, lecture jusqu’à la fin, découpe silencieuse.
- Paquet tar d’Ubuntu 24.04 LTS, version 1.35+dfsg-3ubuntu0.4.
- Annonce de sortie de GNU tar 1.35, liste info-gnu, 18 juillet 2023.