Linux / Commande tree : afficher et filtrer une arborescence

tree affiche les fichiers et répertoires sous forme d’arborescence. Pour examiner un projet sans produire une liste trop longue, commencez par tree -L 2 ./projet, ajoutez -a pour les noms cachés ou -d pour voir uniquement les répertoires.

Ce guide concerne tree pour Unix et Linux, un programme distinct de la commande Windows portant le même nom. Les options disponibles dépendent du paquet installé ; contrôlez sa version avant d’utiliser les filtres Git ou les formats structurés.

Vérifier et installer la version Unix de tree

type -a tree
tree --version
tree --help

tree est un programme externe, pas une commande intégrée à Bash. Si votre shell indique command not found, le paquet peut manquer ou son exécutable peut ne pas figurer dans PATH. Dans un environnement mêlant outils Windows et Unix, type -a permet aussi de repérer un programme homonyme.

Debian et Ubuntu

sudo apt update
sudo apt install tree

La première commande actualise l’index des paquets ; la seconde propose l’installation. Examinez la transaction avant de l’accepter. La fiche Debian du paquet tree permet de vérifier le nom du paquet et ses dépendances pour la version concernée.

Rocky Linux, AlmaLinux, RHEL et Fedora

sudo dnf install tree

Le paquet doit être disponible dans vos dépôts activés. La fiche Fedora de tree présente les versions distribuées. Les offres des dérivés RHEL peuvent varier selon la version et les dépôts ; vérifiez le résultat de la recherche de paquets plutôt que d’ajouter un dépôt au hasard.

Arch Linux

sudo pacman -Syu tree

Cette forme met à jour le système et installe le paquet dans une transaction cohérente ; elle peut donc proposer davantage de changements que la seule installation de tree. Suivez la procédure de maintenance d’Arch Linux pour éviter une mise à niveau partielle. La fiche du paquet Arch Linux donne ses informations de distribution.

Lire un arbre avec un exemple complet

Sans argument, tree part du répertoire courant. Vous pouvez lui donner un chemin, plusieurs répertoires ou un nom protégé par des guillemets :

tree
tree ./src ./tests
tree -- './Projet commun'

Les cibles doivent exister. Les guillemets conservent les espaces et -- termine les options pour éviter qu’un nom commençant par un tiret soit interprété comme une option.

Pour disposer d’un exercice reproductible, lancez ce bloc Bash dans un emplacement où le nom demo-tree n’existe pas :

(
  mkdir -- demo-tree || exit 1
  mkdir -p -- demo-tree/config demo-tree/public demo-tree/src || exit 1
  printf '%s\n' '# Projet exemple' > demo-tree/README.md
  printf '%s\n' 'mode=demo' > demo-tree/config/app.conf
  printf '%s\n' '<!doctype html><title>Exemple</title>' > demo-tree/public/index.html
  printf '%s\n' 'print("Bonjour")' > demo-tree/src/main.py
  printf '%s\n' 'MESSAGE = "demo"' > demo-tree/src/utils.py
)

Le premier mkdir refuse un dossier déjà présent ; les fichiers d’exercice ne sont donc pas écrits dans un ancien dossier du même nom. Les parenthèses limitent les variables et les changements de contexte, mais les dossiers et fichiers créés restent sur disque.

tree -n --charset=UTF-8 --noreport -- ./demo-tree

Pour ce contenu, l’arbre attendu correspond à la structure suivante. Le dessin et l’espacement peuvent varier selon la version et le terminal :

./demo-tree
├── README.md
├── config
│   └── app.conf
├── public
│   └── index.html
└── src
    ├── main.py
    └── utils.py

Les branches expriment une relation de contenu : main.py appartient à src. Les noms sont affichés, les fichiers ne sont pas ouverts pour montrer leur contenu. Cet exemple omet le résumé numérique pour se concentrer sur les relations entre éléments.

Le compteur final sert de repère pour cette vue, pas de preuve d’un inventaire exhaustif. Des limites, filtres ou erreurs peuvent rendre un résumé incomplet ; le manuel signale aussi des limitations de comptage avec certains filtres. Utilisez --noreport si ce résumé n’apporte rien à votre présentation.

Limiter la profondeur et choisir les éléments visibles

Commande Effet recherché
tree -L 1 ./demo-tree Afficher les entrées immédiates, sans leur contenu détaillé.
tree -L 2 ./demo-tree Afficher aussi les entrées au niveau suivant.
tree -a -L 2 ./demo-tree Inclure les noms commençant par un point.
tree -d -L 2 ./demo-tree Montrer seulement les répertoires.
tree --noreport ./demo-tree Omettre le résumé final des nombres de fichiers et répertoires.

-L prend une profondeur, pas une quantité maximale de fichiers. Même à un seul niveau, un répertoire contenant énormément d’entrées peut produire une sortie longue. Si votre version le propose, --filelimit permet de ne pas descendre dans un répertoire dépassant un certain nombre d’entrées ; cette limite produit volontairement une vue partielle.

Contrairement à ls -a, tree -a n’ajoute pas les entrées spéciales . et ... Un fichier comme .env reste un nom ordinaire masqué par défaut ; son point initial ne lui donne aucune protection d’accès.

Pour ajouter un nom caché inoffensif à l’exercice, puis comparer les deux affichages :

(
  set -o noclobber
  printf '%s\n' 'exemple seulement' > ./demo-tree/.cache-demo
)
tree -L 1 -- ./demo-tree
tree -a -L 1 -- ./demo-tree

La seconde vue doit inclure .cache-demo. La protection noclobber refuse d’écraser un fichier déjà présent ; elle ne supprime aucun fichier. Après l’exercice, inspectez le dossier avant de retirer vos objets de démonstration.

Filtrer les noms sans supprimer les fichiers

Inclure des extensions avec -P et retirer les branches vides

tree -P '*.py' -- ./demo-tree
tree -P '*.py' --prune -- ./demo-tree

Le motif *.py retient les fichiers Python. Les répertoires restent normalement visibles pour présenter leur structure, même si aucun fichier retenu n’apparaît dans certains d’entre eux. --prune retire les branches devenues vides : dans l’exercice, la branche src porte les deux fichiers Python.

Pour plusieurs extensions, la barre verticale sépare des motifs alternatifs :

tree -P '*.jpg|*.png|*.webp' --prune -- ./projet

Il s’agit de motifs propres à tree, pas d’expressions régulières de grep. Les guillemets simples empêchent Bash de développer l’astérisque ou d’interpréter la barre comme un pipeline. Pour inclure les noms cachés dans la recherche, ajoutez aussi -a.

L’option --matchdirs change le rôle du motif en permettant aussi une correspondance sur les répertoires. Le contenu d’un répertoire correspondant peut alors être admis sans le même filtrage par nom. Ne l’ajoutez pas si votre intention est seulement de sélectionner les extensions des fichiers.

Exclure des branches et utiliser les règles Git

tree -a -L 3 -I 'node_modules|.git|dist|__pycache__' -- ./projet
tree -L 3 -I '*.log|tmp|cache' -- ./projet

-I exclut des fichiers et des répertoires correspondant au motif. Les fichiers restent sur disque. Choisissez les motifs selon votre objectif : masquer des logs pour expliquer une architecture est utile, mais le même filtre serait trompeur pour inventorier tout le contenu.

tree -a --gitignore -L 3 -- ./projet

Sur une version qui le prend en charge, --gitignore applique des règles provenant des fichiers d’exclusion Git. Le programme peut chercher des fichiers .gitignore dans les parents de la cible et utiliser .git/info/exclude. La vue peut donc dépendre du contexte du dépôt, pas seulement de ses fichiers immédiats.

Ne considérez pas ce résultat comme une copie exacte de git status ni comme un contrôle des données pouvant être publiées. Vérifiez les noms affichés avant de partager la sortie. Le manuel du développeur de tree décrit les motifs, les règles Git et les limites des résumés.

Afficher les métadonnées et choisir le tri

Lire les tailles, les permissions et les dates

tree -s -L 2 -- ./demo-tree
tree -h -L 2 -- ./demo-tree
tree -pugD -L 2 -- ./demo-tree

-s ajoute la taille en octets ; -h affiche des unités lisibles et --si utilise les puissances de 1 000. -p montre le type et les permissions, -u le propriétaire et -g le groupe. -D affiche normalement la date de modification des données ; avec -c, il affiche la date du changement d’état.

La taille ordinaire d’un répertoire décrit sa propre structure telle que le système de fichiers la rapporte. Ce n’est pas la somme automatique de ses descendants. Le guide de ls, des permissions et des horodatages explique ces champs et la différence entre modification des données et changement d’état.

tree --du -h -- ./demo-tree

--du cumule les tailles des éléments parcourus et implique l’affichage des tailles. Il prépare l’arbre en mémoire avant de l’émettre, ce qui peut retarder la première sortie et augmenter l’utilisation mémoire. Les filtres, accès impossibles et limites du parcours influencent le résultat : une vue filtrée ou limitée n’est pas un total exhaustif du stockage.

Ne confondez pas cette accumulation avec un décompte des blocs réellement alloués. Dans le code de tree 2.3.2, les tailles proviennent notamment du champ st_size. Pour analyser l’espace occupé, les fichiers creux et la différence entre taille apparente et allocation, utilisez les critères expliqués dans le guide de du.

Trier et présenter les chemins

tree --dirsfirst -L 2 -- ./demo-tree
tree -t -L 2 -- ./demo-tree
tree --sort=size -r -L 2 -- ./demo-tree
tree -fi --noreport -- ./demo-tree

--dirsfirst regroupe les répertoires avant les fichiers. -t sélectionne le tri par modification, --sort=size le tri par taille et -r inverse l’ordre choisi. Contrôlez le sens affiché avant d’en déduire quels fichiers sont les plus récents ; ne transposez pas automatiquement les habitudes de ls.

-U demande l’ordre des entrées sans tri et désactive les regroupements ainsi que l’inversion de tri dans la version documentée. Le tri par nom dépend aussi de la locale ; LC_ALL=C tree fixe celle de ce lancement.

-f ajoute le préfixe de chemin utilisé pour la cible ; un point de départ relatif ne devient pas automatiquement absolu. -i retire les lignes d’indentation. La combinaison -fi --noreport est commode à lire, mais ne constitue pas un format universel pour traiter tous les noms : noms contenant un saut de ligne, caractères protégés et indications de liens peuvent rendre un découpage par lignes ambigu.

Enregistrer une vue texte et exporter du JSON ou du XML

Créer un fichier texte hors du dossier examiné

Depuis le parent de demo-tree, ce bloc écrit un nouveau fichier texte à côté de l’arbre :

(
  set -o noclobber
  tree -n -L 3 -I '.git|node_modules|dist' --noreport -- ./demo-tree > ./demo-tree.txt
)

-n désactive les couleurs pour cette sortie ; évitez d’ajouter -C, qui les force. La protection noclobber refuse un fichier de destination déjà présent. Le fichier est placé hors de demo-tree pour ne pas l’inclure dans son propre inventaire. Pour un vrai projet, adaptez à la fois le chemin cible et l’emplacement de sortie.

tree -o fichier.txt propose aussi une sortie directe, mais cette ouverture est effectuée par le programme : noclobber du shell ne la protège pas. Utilisez une destination neuve et vérifiez la portée de l’écrasement avant de relancer un export.

Si les branches s’affichent mal, vérifiez la police et l’encodage du terminal. Une présentation simple peut être obtenue avec --charset=ASCII. Pour un README, conservez la sortie dans un bloc de code afin de préserver l’alignement.

Valider un export JSON sans écraser un ancien résultat

-J produit un tableau en JSON, ou JavaScript Object Notation, et -X un document XML, ou Extensible Markup Language. Pour un exemple complet, tree et Python 3 doivent être disponibles sous les noms tree et python3 :

(
  command -v tree >/dev/null || exit 127
  command -v python3 >/dev/null || exit 127
  set -o noclobber

  if tree -n -J -L 3 --noreport -- ./demo-tree > ./demo-tree.json; then
    python3 -m json.tool ./demo-tree.json >/dev/null || exit 1
    printf '%s\n' 'Export JSON valide : ./demo-tree.json'
  else
    statut=$?
    printf '%s\n' 'Export incomplet ou fichier de destination deja present.' >&2
    exit "$statut"
  fi
)

En cas de réussite, le script affiche le nom du fichier et le parseur Python confirme une syntaxe JSON valide. Il ne prétend pas qu’une sortie syntaxiquement valide contient tout l’arbre : examinez aussi le statut de tree, ses diagnostics et les éventuels champs d’erreur. Le format et les champs peuvent varier selon la version.

Une destination existante est conservée. Si une nouvelle exportation échoue après son ouverture, un fichier partiel peut rester ; inspectez-le et choisissez un autre nom ou retirez-le explicitement avant de recommencer. Les parenthèses évitent de conserver l’option noclobber dans votre shell.

Pour produire du XML dans une destination distincte :

(
  set -o noclobber
  tree -n -X -L 3 --noreport -- ./demo-tree > ./demo-tree.xml
)

Utilisez un parseur adapté au format structuré. Si vous voulez surtout appliquer des opérations à des fichiers, un parcours dédié avec find et des séparateurs NUL peut être plus approprié que l’analyse d’une présentation humaine de tree.

Contrôler les liens, les frontières et les résultats incomplets

tree -l -L 3 -- ./projet
tree -x -L 3 -- ./projet

Sans -l, tree montre normalement les liens symboliques avec leur cible sans parcourir les répertoires pointés. Avec -l, il les suit lorsqu’ils pointent vers un répertoire. Les boucles détectées sont évitées, mais la portée et la quantité de travail peuvent augmenter ; choisissez d’abord un point de départ précis et une profondeur raisonnable.

-x limite la traversée au système de fichiers de départ. Ce n’est pas une limite générale de tous les montages, par exemple quand un autre montage présente le même système de fichiers, ni une frontière de sécurité.

Lorsqu’une vue est étonnamment courte, vérifiez dans cet ordre :

  1. Le chemin de départ et la version du programme réellement trouvé par le shell.
  2. La profondeur, les noms cachés, les motifs -P/-I et les règles Git.
  3. Le suivi des liens et les limites -x ou --filelimit éventuellement choisis.
  4. Les diagnostics et les droits nécessaires pour lire et traverser les répertoires.

Ne lancez pas automatiquement le parcours avec sudo pour obtenir davantage de lignes. Déterminez d’abord les chemins utiles et les droits attendus. Une arborescence complète du répertoire personnel ou de la racine peut être très volumineuse ; un résultat de tree décrit une lecture à un moment donné, pas un instantané cohérent d’un arbre que d’autres processus modifient.

Avant de partager un export, examinez les noms de fichiers, les chemins internes et les éventuels commentaires ajoutés par des options. Pour comparer les options d’une autre version, la page de manuel tree distribuée par Arch Linux complète l’aide de votre installation.