L'antisèche de la commande tar que vous cherchez vraiment met les recettes pour créer et extraire tout en haut, parce que c'est toute la raison de votre venue : vous avez un dossier, vous le voulez dans un seul fichier gzippé, et vous le vouliez il y a trente secondes. Copiez la ligne, changez les noms, on continue. Ce que personne n'avoue sur tar, c'est que la syntaxe n'est pas dure, elle est juste impossible à retenir, alors ceci règle aussi la mémoire grâce à un moyen mnémotechnique qui colle. tar regroupe plein de fichiers en une seule archive, et tout seul il ne compresse rien : la compression est une option séparée qu'on greffe par-dessus (z pour gzip, j pour bzip2, etc.). Savoir que ces deux boulots sont séparés, c'est déjà la moitié du combat.
The short answer
Créez un .tar.gz avec tar -czf archive.tar.gz dossier/ (Create Ze File).
Extrayez-le avec tar -xzf archive.tar.gz (eXtract Ze File). Jetez un oeil avant
avec tar -tzf archive.tar.gz, qui liste le contenu sans rien décompresser.
Extrayez à un endroit précis en ajoutant -C /chemin/cible. Et oubliez les
lettres carrément avec tar -caf archive.tar.zst, où le a choisit le
compresseur d'après l'extension.
Vous avez un dossier. Vous le voulez dans un seul fichier, sûrement gzippé, et vous le vouliez il y a trente secondes. C'est toute la raison de votre venue, donc les recettes pour créer et extraire sont tout en haut. Copier, changer les noms, on continue. Ce que personne n'avoue sur tar, c'est que la syntaxe n'est pas dure, elle est juste impossible à retenir. Alors réglons aussi ce problème de mémoire.
Petite mise au point. tar regroupe plein de fichiers en une seule archive, et tout seul il ne compresse rien. La compression est une option séparée qu'on greffe par-dessus (z pour gzip, j pour bzip2, etc.). Savoir que ces deux boulots sont séparés, c'est déjà la moitié du combat.
Extraire une archive (eXtract Ze File)
Voici le moyen mnémotechnique qui répare tar pour de bon. tar -xzf, c'est eXtract Ze File. Dites-le à voix haute une fois et vous n'inverserez plus jamais les lettres. Le x extrait, le z gère le gzip, le f dit « le mot suivant est le nom du fichier ». Ce dernier compte plus qu'il n'en a l'air : oubliez le f et tar part chercher un lecteur de bande, ce qui sur votre portable veut dire qu'il reste planté là, à vous fixer.
| Commande | Ce qu'elle fait |
|---|---|
tar -xzf archive.tar.gz | eXtrait une archive gzip dans le dossier courant |
tar -xzf archive.tar.gz -C /opt/app | Extrait dans /opt/app plutôt qu'ici (le -C change de dossier d'abord) |
tar -xzvf archive.tar.gz | Pareil, mais verbeux, donc il affiche chaque fichier au fur et à mesure |
tar -xf archive.tar | Un .tar non compressé. Pas besoin de z, il n'y a rien à décompresser |
Le tar GNU moderne sait en général flairer la compression tout seul, donc tar -xf archive.tar.gz marche souvent sans le z. Je tape quand même le z par habitude, et franchement parce que je ne fais pas confiance à chaque machine où je me connecte en SSH pour avoir un tar assez récent pour deviner juste. Ceinture et bretelles.
Créer une archive (Create Ze File)
Le même trio, une lettre changée. c à la place de x, donc -czf se lit Create Ze File. L'ordre des arguments, c'est ce que les gens ratent : le nom de l'archive vient d'abord, puis ce qu'on met dedans. Le nom, ensuite le contenu. Inversez et vous pouvez écraser votre source avec une archive vide, ce qui fait un après-midi vraiment pourri.
| Commande | Ce qu'elle fait |
|---|---|
tar -czf archive.tar.gz dossier/ | Crée une archive gzip de dossier/ |
tar -czvf logs.tar.gz /var/log/myapp | Pareil en verbeux, pratique pour surveiller un gros job |
tar -czf backup.tar.gz file1 file2 dir3 | Regroupe plusieurs choses d'un coup, fichiers et dossiers mêlés |
tar -cf archive.tar dossier/ | Un tarball non compressé (pas de z), plus gros mais instantané |
Vous voulez qu'on vous la construise, avec les bonnes options et un nom de fichier propre ? Notre générateur de commande tar assemble la ligne exacte en deux clics. Aucune honte à cliquer. La moitié de mes commandes tar commencent là avant d'atterrir dans un terminal.
Lister le contenu sans extraire
La sous-estimée. Avant de déballer l'archive d'un inconnu dans votre dossier perso, regardez d'abord. -t est l'option de liste (t comme « table des matières », en gros). Elle lit l'archive et affiche chaque chemin, sans rien toucher sur le disque.
| Commande | Ce qu'elle fait |
|---|---|
tar -tzf archive.tar.gz | Liste le contenu d'une archive gzip, n'extrait rien |
tar -tzvf archive.tar.gz | Liste verbeuse, avec les tailles et les permissions, et les dates aussi |
tar -tf archive.tar | Liste un tarball non compressé |
Pourquoi s'embêter ? À cause de la tarbombe, j'y viens. Un petit -tzf vous dit si l'archive garde poliment tout sous un seul dossier de tête, ou si elle est sur le point de cracher quarante fichiers en vrac là où vous vous trouvez.
Choisir un compresseur : gzip, bzip2, xz, zstd
Une lettre choisit la compression, et cette lettre doit s'aligner avec l'extension de votre fichier sinon ça devient vite confus. Gzip est le réflexe par défaut de tout le monde. xz compresse plus fort mais plus lentement. zstd est le petit nouveau qui est rapide et compresse bien, ce qui explique qu'il continue de manger le pain des autres.
| Commande | Ce qu'elle fait |
|---|---|
tar -czf archive.tar.gz dossier/ | gzip (z). Rapide, partout, le défaut sûr |
tar -cjf archive.tar.bz2 dossier/ | bzip2 (j). Plus petit que gzip, nettement plus lent |
tar -cJf archive.tar.xz dossier/ | xz (J majuscule). Le meilleur ratio des trois classiques, le plus lent |
tar --zstd -cf archive.tar.zst dossier/ | zstd. Excellente vitesse et bon ratio, via la longue option --zstd |
Notez que J est majuscule et j minuscule, et ils désignent des compresseurs complètement différents. Cette casse m'a brûlé plus d'une fois, en général au pire moment. Pour extraire, remplacez le c par un x et gardez la même lettre de compresseur : tar -xjf, tar -xJf, tar --zstd -xf.
Mon avis : apprenez tar caf et arrêtez de mémoriser z, j et J. Le tar GNU moderne laisse l'option a (« auto-compress ») choisir le compresseur directement d'après le nom de fichier. Donc tar -caf backup.tar.zst dossier/ utilise zstd, tar -caf backup.tar.xz dossier/ utilise xz, sans table de correspondance à garder en tête. Vous nommez le fichier, tar lit l'extension, terminé. Le hic, et il est réel : -a n'aide que du côté création, et seulement sur un tar GNU assez récent (donc pas toujours sur macOS ni sur certains conteneurs minimalistes). Pour extraire, vous revenez à -xf qui laisse tar autodétecter, ce qu'il fait heureusement la plupart du temps. Je pense que caf est la meilleure habitude à prendre ici. Peut-être que je le survends parce que je suis franchement incapable de retenir j contre J, mais le gain est réel.
Les options qui sauvent votre après-midi
Au-delà de créer et extraire, une poignée d'options fait le gros du travail. Sortir un seul fichier d'une archive géante. Sauter le superflu dont vous ne voulez pas. Aplatir un dossier d'emballage que vous n'avez jamais demandé. Voilà celles qui méritent un post-it.
| Commande | Ce qu'elle fait |
|---|---|
tar -xzf archive.tar.gz chemin/dans/fichier.conf | Extrait un seul fichier, par son chemin exact dans l'archive |
tar -czf site.tar.gz site/ --exclude='*.log' | Ignore tous les fichiers .log pendant l'archivage |
tar -xzf archive.tar.gz --strip-components=1 | Retire le dossier de tête, les fichiers atterrissent sans le dossier d'emballage |
tar -xzvf archive.tar.gz | Ajoutez v n'importe où pour une liste verbeuse des fichiers au défilé |
tar -rf archive.tar extra.txt | Ajoute un fichier à un tar non compressé existant (voir le hic plus bas) |
Ce --strip-components=1 est le héros méconnu. Tellement d'archives emballent tout dans un seul dossier projet-1.4.2/ dont vous ne vouliez pas. Retirez un niveau et le contenu atterrit pile là où vous êtes, sans emballage à nettoyer après. Je m'en sers tout le temps sur les tarballs de sources.
Pourquoi on ne peut pas ajouter à un .tar.gz
Voici le piège qui coince tout le monde. tar -rf ajoute à une archive, mais seulement non compressée. Essayez sur un .tar.gz et tar refuse, net. La raison est simple une fois qu'on la voit : un fichier gzip est un seul flux compressé continu avec un marqueur de fin, pas un conteneur bien rangé avec un emplacement où coller des choses. Il n'y a pas de couture propre à rouvrir. Pour ajouter un fichier à une archive compressée, vous la décompressez, ajoutez, puis recompressez : gunzip archive.tar.gz, ensuite tar -rf archive.tar nouveaufichier, ensuite gzip archive.tar. Pénible, mais c'est le format, pas tar qui fait des caprices.
Faire transiter un tar directement par SSH
Celle-ci a un côté magique la première fois. Vous pouvez faire transiter une archive tar par une connexion SSH sans jamais l'écrire sur le disque côté émetteur. Le - à la place du nom de fichier veut dire « utilise la sortie standard plutôt qu'un fichier », et l'autre bout attrape simplement le flux.
| Commande | Ce qu'elle fait |
|---|---|
tar -czf - dir/ | ssh host "cat > out.tar.gz" | Envoie une archive compressée de dir/ vers un fichier sur host |
tar -czf - dir/ | ssh host "tar -xzf - -C /dest" | Empaquette ici, déballe là-bas, rien ne touche le disque local |
La deuxième forme est la vraiment utile : elle copie toute une arborescence vers une autre machine et l'extrait à l'arrivée, le tout dans un seul tube. Les permissions et la structure survivent au voyage. C'est le geste que je dégaine quand rsync n'est pas installé sur une machine dépouillée et que j'ai juste besoin des fichiers là-bas, maintenant.
Et après
Voilà la trousse de travail. Créer, extraire, lister, les quatre compresseurs, plus exclude, strip-components, l'extraction d'un seul fichier, et le tube SSH pour déplacer les choses. Franchement, ça couvre presque tout ce que je fais avec tar dans une semaine normale, et la rare bizarrerie je la recherche comme tout le monde.
Si vous avez de toute façon les mains dans le shell, le même réflexe « copier plutôt que mémoriser » paie ailleurs. Vous chassez des fichiers par nom ou par taille ? L'antisèche de la commande find a ces recettes regroupées de la même façon. Vous tripotez des connexions et des interfaces ? Voyez nos commandes réseau Linux avec ip et ss. Et quand un fichier extrait atterrit avec les mauvaises permissions, le calculateur de permissions chmod détaille exactement ce que 644 contre 755 accorde vraiment.
Sources
Questions fréquentes
Comment extraire un fichier tar.gz sous Linux ?
Lancez tar -xzf archive.tar.gz. Retenez-le comme eXtract Ze File : x extrait, z gère la compression gzip, et f veut dire que le mot suivant est le nom du fichier. Ça déballe dans votre dossier courant. Pour envoyer les fichiers à un endroit précis à la place, ajoutez -C /chemin/cible à la fin pour qu'ils ne se déversent pas là où vous êtes.
Comment créer une archive tar.gz ?
Utilisez tar -czf archive.tar.gz dossier/. C'est Create Ze File : c crée, z gzippe, f nomme le fichier. Le nom de l'archive vient d'abord, ensuite ce que vous empaquetez dedans. Inversez cet ordre et vous risquez d'écraser votre source, donc le nom d'abord, le contenu ensuite, toujours.
Comment lister le contenu d'un fichier tar sans extraire ?
Lancez tar -tzf archive.tar.gz. L'option t liste la table des matières et ne déballe absolument rien. Ajoutez un v pour tar -tzvf afin de voir aussi tailles, permissions et dates. Ça vaut le coup avant d'extraire une archive inconnue, pour savoir si tout tient sous un seul dossier ou si ça va se disperser.
Quelle différence entre tar -z, -j et -J ?
Chaque lettre choisit un compresseur. Le z minuscule c'est gzip, le défaut rapide du quotidien. Le j minuscule c'est bzip2, plus petit mais plus lent. Le J majuscule c'est xz, le meilleur ratio des trois et le plus lent. La casse compte : j et J sont des outils différents. Sur un tar GNU récent vous pouvez éviter les devinettes avec -caf, qui choisit le compresseur d'après l'extension du fichier.
Pourquoi je ne peux pas ajouter un fichier à un tar.gz ?
Parce qu'un fichier gzip est un seul flux compressé continu avec un marqueur de fin, pas un conteneur avec de la place pour coller des choses. L'option d'ajout -r ne marche que sur un .tar non compressé. Pour ajouter à une archive compressée, décompressez avec gunzip, ajoutez avec tar -rf archive.tar nouveaufichier, puis recompressez avec gzip. C'est le format qui veut ça, pas une limite de tar que vous pourriez contourner avec une option.