Terug naar hoofdinhoud

Linux commando: tree

18 juli 2026

Voer ls uit in een diep project en je krijgt steeds maar een platte laag tegelijk. Je ziet de mappen, dan stap je in de een, dan de ander, en zo bouw je de vorm van het geheel in je hoofd weer op. tree doet dat werk voor je. Het loopt de map naar beneden door en tekent de hele structuur als een enkel ingesprongen diagram, met nette lijnen die precies laten zien wat in wat zit. Een commando, en de indeling van een heel project staat op je scherm.

1. De basis

De taak van tree is om een map en alles eronder als een plaatje te tonen. Je richt het op een map, en het print een ingesprongen lijst met tekenlijnen die elk item met zijn ouder verbinden:

$ tree
.
└── project
    ├── docs
    │   └── guide.md
    ├── README.md
    ├── src
    │   ├── main.py
    │   └── utils.py
    └── tests
        └── test_main.py

5 directories, 5 files

Het ene idee dat tree anders maakt dan ls is recursie tot in de vorm. Waar ls een map als een lijst toont, blijft tree in elke submap afdalen en drukt de nesting visueel uit. De verticale balken en hoeken zijn geen versiering; ze zijn de grammatica. Een betekent "deze tak gaat hieronder verder", een ├── betekent "hier is een item en er komen nog buren na", en een └── betekent "hier is het laatste item in deze map". Lees die drie tekens en je kunt elk bestand terug naar de wortel volgen.

De laatste regel is het rapport: een lopende telling van hoeveel mappen en bestanden tree heeft geprint. Het is een snelle controle op de omvang van wat je bekijkt, en sectie 4 laat zien hoe je het uitzet.

tree somt niet zomaar een map op; het tekent hem. De lijnen zijn de betekenis, niet het sieraad.

Het juiste mentale model: ls geeft je een verdieping van een gebouw tegelijk, terwijl tree je de hele plattegrond in een keer geeft. Je verliest de fijne details die een lange ls -l toont, maar je wint de vorm, en de vorm is meestal waar je voor kwam.

Naar boven

2. Waar komt de naam vandaan?

De naam is het plaatje. Teken een map met zijn submappen die uitwaaieren en zijn bestanden die aan de uiteinden hangen, en je hebt een boom getekend (in het Engels een "tree"): een enkele wortel bovenaan, takken die zich in meer takken splitsen, en bladeren aan de tippen. Informatici noemen precies deze structuur al sinds de vroegste dagen van het vak een "boom", omdat het overeenkomt met de botanische vorm op zijn kop.

Een bestandssysteem is een boom in deze precieze zin. Er is een wortel, geschreven als /, elke map is een tak die meer takken kan bevatten, en elk gewoon bestand is een blad met niets eronder. Het commando verzint de metafoor niet; het tekent gewoon de boom die er altijd al was. Als je tree uitvoert, kijk je naar de letterlijke datastructuur waarop je bestandssysteem is gebouwd.

Dus de naam is zo direct als een naam maar kan zijn. De tool toont je de boom, en het heet tree. Er is geen afkorting en geen verborgen grap, alleen het meest voor de hand liggende woord voor het ding op het scherm.

Naar boven

3. Een korte geschiedenis

Anders dan ls of cd is tree geen oorspronkelijk Unix-commando en komt het niet van Bell Labs. Het is geschreven door Steve Baker en voor het eerst uitgebracht halverwege de jaren negentig als een klein, zelfstandig hulpprogramma. Het idee was bescheiden: neem de recursieve lijst die mensen al met de hand bouwden met ls -R en pipes, en teken die netjes met verbindingslijnen zodat de structuur in een oogopslag te lezen is.

Omdat het nuttig en klein was, verspreidde het zich. Andere bijdragers voegden er in de loop der jaren stukken aan toe: Francesc Rocher voegde HTML-uitvoer toe, en Kyosuke Tokoro voegde ondersteuning toe voor verschillende tekensets en OS/2. Die geschiedenis staat gedrukt in de versieregel:

TijdperkMijlpaal
1996 Steve Baker brengt de eerste tree uit: een recursieve lijst getekend met verbindingslijnen
eind jaren 90 HTML-uitvoer toegevoegd, zodat een mappenboom als klikbare webpagina gepubliceerd kan worden
jaren 90-2000 Tekenset- en OS/2-ondersteuning toegevoegd, zodat de tekenlijnen op veel systemen goed weergegeven worden
jaren 2020 Versie 2 komt met JSON-uitvoer, .gitignore-filtering, en een nieuw onderhoudsteam
Vandaag tree zit in de repositories van elke grote distributie, al is het vaak niet standaard geinstalleerd

De versie op het referentiesysteem van dit artikel is tree v2.1.1. De commando's hieronder zijn geschreven voor de 2.x-serie; een veel oudere tree mist de nieuwere opties zoals -J en --gitignore, maar elke basisvlag gedraagt zich al decennia hetzelfde.

Een praktisch gevolg van deze geschiedenis telt zwaarder dan welke datum ook: tree is geen onderdeel van GNU coreutils. De dagelijkse commando's ls, cp en rm zijn altijd aanwezig, maar tree is een apart pakket dat veel minimale servers en containers niet meeleveren. Als het commando ontbreekt, installeer het dan op naam:

$ sudo apt install tree      # Debian, Ubuntu
$ sudo dnf install tree      # Fedora
$ sudo pacman -S tree        # Arch Linux
Naar boven

4. Eenvoudige toepassingen

4.1 Het simpelst mogelijke gebruik

Voer tree uit zonder argumenten en het tekent de huidige map en alles eronder:

$ tree
.
├── docs
│   └── guide.md
└── src
    └── main.py

2 directories, 2 files

De enkele punt . bovenaan is de startmap, dezelfde . die overal elders in de shell "hier" betekent. Om een andere map te tekenen, geef je die als argument mee:

$ tree /etc/nginx
/etc/nginx
├── nginx.conf
└── conf.d
    └── default.conf

4.2 Beperk hoe diep het gaat

Bij een groot project kan de volledige boom pagina's lang scrollen. De -L-vlag (kort voor level, niveau) stopt het afdalen na een vast aantal niveaus, en dat is de nuttigste vlag die tree heeft:

$ tree -L 1        # only the top level, like a quick ls
.
├── docs
├── README.md
├── src
└── tests

3 directories, 1 file

Grijp naar -L wanneer je iets onbekends verkent. Begin met -L 1 of -L 2 om de grote vorm te zien, en daal dan af in de ene tak die je interesseert.

4.3 Toon verborgen bestanden

Net als ls verbergt tree standaard bestanden waarvan de naam met een punt begint. De -a-vlag (kort voor all, alles) laat ze zien:

$ tree -a -L 1
.
├── .env
├── .gitignore
├── docs
├── README.md
└── src

Zo zie je configuratiebestanden zoals .env en .gitignore, en ook de .git-map, die meestal groot is en zelden iets dat je wilt uitklappen. Sectie 5 laat zien hoe je die weer verbergt terwijl je de rest houdt.

4.4 Alleen mappen

Als je alleen om het geraamte geeft en niet om de losse bestanden, print de -d-vlag (kort voor directories, mappen) alleen de mappen:

$ tree -d
.
├── docs
├── src
└── tests

3 directories

Dit geeft je de kaart van een project zonder de rommel van elk bronbestand, precies wat je wilt als je je weg leert kennen in een nieuwe codebase.

4.5 Zet de samenvattingsregel uit

Elke boom eindigt met de rapportregel, zoals 3 directories, 5 files. Op het scherm is die handig, maar hij zit in de weg als je een boom in een document opslaat of aan een ander programma doorgeeft. De --noreport-vlag verwijdert hem en laat alleen het diagram over:

$ tree -L 1 --noreport
.
├── docs
├── README.md
├── src
└── tests

Gebruik het wanneer de boom in een README, een e-mail of een script terechtkomt, waar een afsluitende tellregel alleen maar ruis zou zijn.

Naar boven

5. Gemiddelde toepassingen

5.1 Toon alleen bestanden die op een patroon passen

De -P-vlag (kort voor pattern, patroon) houdt alleen bestanden over waarvan de naam op een shell-glob past. Het is perfect om de vraag "waar staan alle Python-bestanden?" te beantwoorden:

$ tree -P '*.py'
.
├── docs
├── src
│   ├── main.py
│   └── utils.py
└── tests
    └── test_main.py

Merk op dat lege mappen zoals docs nog steeds verschijnen, want -P filtert alleen bestanden, geen mappen. Om de mappen te verbergen die uiteindelijk niets bevatten, voeg je --prune toe, dat lege takken verwijdert:

$ tree -P '*.py' --prune
.
├── src
│   ├── main.py
│   └── utils.py
└── tests
    └── test_main.py

Zet het patroon altijd tussen aanhalingstekens, zoals in '*.py', zodat de shell de glob ongewijzigd aan tree geeft in plaats van hem eerst tegen de huidige map uit te breiden.

5.2 Verberg wat je niet wilt zien

Het tegenovergestelde van -P is -I (kort voor ignore, negeren), dat elk bestand of elke map die op het patroon past laat vallen. Zo breng je de luidruchtige mappen tot zwijgen die een echt project domineren:

$ tree -I 'node_modules|.git' -L 2

De | scheidt meerdere patronen, dus deze ene aanroep verbergt zowel node_modules als .git. Bij een JavaScript-project is die enkele vlag het verschil tussen een leesbare boom en tienduizend regels afhankelijkheden.

5.3 Respecteer .gitignore automatisch

Versie 2 voegde een slimmere versie van hetzelfde idee toe. De --gitignore-vlag leest de .gitignore-bestanden van het project en verbergt precies wat Git al negeert, zodat je boom overeenkomt met de bestanden die echt bij het project horen:

$ tree -a --gitignore
.
├── .gitignore
├── docs
├── README.md
└── src
    ├── main.py
    └── utils.py

Let op dat --gitignore de .git-map zelf niet verbergt; combineer het met -I '.git' als je een schone weergave van alleen de gevolgde indeling wilt.

5.4 Voeg groottes en leesbare eenheden toe

De -s-vlag (kort voor size, grootte) print de grootte van elk bestand in bytes, en -h (kort voor human-readable, leesbaar voor mensen) herschrijft die bytes als K, M en G:

$ tree -h src
src
├── [   5]  main.py
└── [   5]  utils.py

De grootte tussen haakjes is de grootte van elk bestand alleen. Om te zien hoeveel een hele map inneemt, inclusief alles erin, voeg je --du toe (kort voor disk usage, schijfgebruik), dat de inhoud omhoog door de boom optelt, net zoals het commando du doet:

$ tree -h --du
.
└── [ 16K]  project
    ├── [4.0K]  docs
    └── [4.0K]  src

  20K used in 2 directories

5.5 Sorteer op tijd in plaats van naam

Standaard sorteert tree de items alfabetisch. De -t-vlag (kort voor time, tijd) sorteert in plaats daarvan op laatste wijziging, en -r (kort voor reverse, omkeren) draait elke sortering om, zodat -t -r de meest recent gewijzigde bestanden onderaan zet waar je oog landt:

$ tree -t -r

Een verwante favoriet is --dirsfirst, dat alle mappen op elk niveau boven alle bestanden groepeert. Veel mensen vinden die indeling makkelijker te scannen dan een strikt alfabetische mix van bestanden en mappen.

Naar boven

6. Gevorderde toepassingen

6.1 Volledige paden voor pipes en scripts

De tekenlijnen zijn heerlijk voor mensenogen maar nutteloos voor een ander programma. De -f-vlag (kort voor full path, volledig pad) print het complete pad van elk item, en -i (kort voor indentation off, inspringen uit) verwijdert de boomlijnen en laat een platte lijst over die je elders kunt invoeren:

$ tree -if
.
./docs
./docs/guide.md
./src
./src/main.py
./src/utils.py

Gecombineerd met -P wordt dit een leesbaar, gestructureerd alternatief voor een kaal find voor snelle taken. Voor echt scripten zijn de gestructureerde uitvoeren hieronder echter veiliger.

6.2 Machineleesbare uitvoer: JSON en XML

Als een ander programma de boom moet verwerken, vraag hem dan in een echt gegevensformaat. De -J-vlag (kort voor JSON) print de structuur als JSON, en -X print XML:

$ tree -J docs
[
  {"type":"directory","name":"docs","contents":[
    {"type":"file","name":"guide.md"}
  ]}
,
  {"type":"report","directories":1,"files":1}
]

De JSON-uitvoer nest contents-arrays precies zoals de visuele boom zijn takken nest, zodat een script de structuur direct kan doorlopen. Pipe het naar een tool als jq om het te filteren of te herschikken. Dit is de juiste manier om een programma een mappenindeling te laten lezen; het parsen van de getekende lijnen met de kadertekens is fragiel en kun je beter vermijden.

6.3 Publiceer een boom als webpagina

De -H-vlag (kort voor HTML) schrijft een complete HTML-pagina, waarbij elk item een klikbare link wordt ten opzichte van het basisadres dat je opgeeft:

$ tree -H '.' -o index.html      # write a browsable listing to a file

De -o-vlag (kort voor output, uitvoer) stuurt het resultaat naar een bestand in plaats van naar het scherm. Richt een browser op dat bestand en je krijgt een doorbladerbare index van de map, dezelfde functie die tree ooit een snelle manier maakte om een downloadmap te publiceren.

6.4 Extra details: rechten, eigenaren en typemarkeringen

tree kan elk item annoteren met dezelfde metadata die ls -l toont. De -p-vlag (kort voor permissions, rechten) print de modusreeks, -u (kort voor user, gebruiker) print de eigenaar, -g (kort voor group, groep) print de groep, en -F (kort voor file type, bestandstype, net als ls -F) voegt een markering toe zoals / voor een map of * voor een uitvoerbaar bestand:

$ tree -pF docs
docs
└── [-rw-rw-r--]  guide.md

Met deze vlaggen wordt tree een recursieve ls -l die de vorm behoudt, wat handig is als je rechten over een hele deelboom tegelijk controleert.

6.5 Als de lijnen op rommel lijken

De verbindingslijnen worden getekend met speciale kadertekens. Als je terminal, lettertype of bestandscodering ze niet kan tonen, krijg je kapotte symbolen zoals M-bM-^T in plaats van nette hoeken. De optie --charset vertelt tree met welke tekenset hij moet tekenen, en het gewone ascii valt terug op gewone toetsenbordtekens die overal weergegeven worden:

$ tree --charset=ascii docs
docs
`-- guide.md

Hier worden de hoeken `-- en de takken |--. Het is minder mooi maar volkomen draagbaar, precies wat je wilt als je een boom in een e-mail, een ticket of een document plakt dat elke codering moet overleven.

Standaard toont tree een symbolische link maar stapt er niet doorheen. Het print de link en waar hij naar wijst, met een pijl, en stopt daar:

$ tree
.
├── link_to_real -> real
└── real
    └── inside
        └── file.txt

De -l-vlag (kort voor follow links, links volgen) vertelt tree om een gelinkte map als een echte te behandelen en erin af te dalen, zodat de inhoud ervan ook onder de link verschijnt:

$ tree -l
.
├── link_to_real -> real
│   └── inside
│       └── file.txt
└── real
    └── inside
        └── file.txt

Links volgen is krachtig maar riskant, want een link kan terugwijzen naar een map die hem bevat, wat een eindeloze lus veroorzaakt. tree beschermt hiertegen: het houdt bij welke mappen het al heeft bezocht, en als een link het ergens heen zou sturen waar het al is geweest, markeert het het item en weigert het om verder af te dalen in plaats van eindeloos rond te draaien:

$ tree -l
.
└── loopback -> ..  [recursive, not followed]

De les is om -l bewust te gebruiken, alleen als je gelinkte mappen echt uitgeklapt wilt hebben, en om de melding [recursive, not followed] te vertrouwen als teken dat het vangnet zijn werk heeft gedaan.

Naar boven

7. Iets dat de meeste gebruikers niet weten

7.1 De lijnen gaan vanzelf uit

Net als ls kleurt tree zijn uitvoer met jouw LS_COLORS-instelling, maar alleen als het naar een echte terminal schrijft. Zodra je het naar less pipet of naar een bestand omleidt, laat het stilletjes de kleurcodes vallen zodat ze de tekst niet vervuilen met stuurtekens:

$ tree | less      # colors off automatically, no garbage in the pager

Dit is hetzelfde welgemanierde gedrag dat ls heeft, en het verklaart een veelvoorkomende verwarring: kleur die op het scherm verschijnt maar in een opgeslagen bestand verdwijnt is geen bug. Als je de kleurcodes echt door een pipe wilt bewaren, forceer ze dan aan met -C (kort voor color, kleur); om ze zelfs op een terminal uit te forceren, gebruik je -n (kort voor no color, geen kleur).

7.2 tree kan een boom weer inlezen

Bijna niemand weet dit: tree kan zijn diagram bouwen uit een platte lijst van paden in plaats van een echte map, met --fromfile. Voer het de uitvoer van find of een willekeurige lijst van paden, en het tekent de boom die die paden impliceren, zelfs voor bestanden die helemaal niet op deze machine staan:

$ find . -type f | tree --fromfile
.
├── docs
│   └── guide.md
└── src
    └── main.py

Dit maakt van tree een algemene manier om elke hierarchie te visualiseren die als een lijst van paden met schuine strepen te schrijven is, van de bestandenlijst van een externe server tot de sleutels van een configuratiebestand. De tekenmotor maakt het niet uit of de paden echt zijn.

7.3 Weten waar tree stopt

Een deel van vakmanschap is weten welke tool het overneemt wanneer tree zijn grens bereikt:

BehoefteGebruikWaarom
Bestanden vinden op grootte, leeftijd of eigenaar en er iets mee doen find tree toont een structuur; het voert geen tests of acties op treffers uit
Zoeken in de inhoud van bestanden grep tree kent alleen namen en metadata, nooit wat er in een bestand staat
Meten en rangschikken wat de meeste schijf gebruikt du tree --du toont groottes ter plekke, maar du is gebouwd voor totalen en sorteren
Een lijst op een regel met volledige details ls -l Als je maar een map nodig hebt, is ls sneller te lezen en altijd geinstalleerd
Een snelle, .gitignore-bewuste zoekactie door een project fd Een moderne vervanger voor find die sneller is en standaard genegeerde bestanden overslaat
Een boomweergave met rijke kleuren, iconen en Git-status eza --tree Een moderne vervanger voor ls waarvan de --tree-modus details toevoegt die tree niet toont

De gezonde gewoonte is om tree te gebruiken om een indeling te begrijpen en de andere tools om er iets mee te doen. Teken de vorm met tree, en grijp dan naar find, grep of du om het echte werk te doen. Op systemen waar je ze kunt installeren, zijn fd en eza --tree het kennen waard als snellere, vriendelijkere neefjes van het klassieke paar.

Naar boven

8. Beste praktijken

  • Begin ondiep met -L. Voer bij elke onbekende map eerst tree -L 2 uit om de vorm te zien, en daal dan af in de ene tak die je interesseert.
  • Verberg de ruis. Voeg -I 'node_modules|.git|__pycache__' toe zodat de boom van een echt project leesbaar blijft in plaats van te verdrinken in afhankelijkheden.
  • Gebruik --gitignore in een repository. Het toont de bestanden die echt bij het project horen zonder dat je elke rommelmap met de hand hoeft op te sommen.
  • Zet je patronen tussen aanhalingstekens. Schrijf tree -P '*.log', niet tree -P *.log, anders breidt de shell de glob uit voordat tree hem ziet.
  • Gebruik --charset=ascii als je deelt. Voor een e-mail, ticket of README overleven platte ASCII-lijnen elke codering; de mooie kadertekens misschien niet.
  • Grijp naar -J voor scripts. Parse nooit de getekende lijnen in een programma; vraag om JSON en laat een echte parser het lezen.
  • Onthoud dat het misschien niet geinstalleerd is. tree is geen onderdeel van coreutils, dus een verse server of container heeft vaak eerst apt install tree nodig.

Als je alle details nodig hebt, is de documentatie een commando ver weg:

$ man tree        # the full manual with every option
$ tree --help     # a quick summary of every flag
Naar boven

9. Veelgemaakte fouten

9.1 Vier veelvoorkomende mythes

MytheWerkelijkheid
"tree is altijd beschikbaar, net als ls." Het is een apart pakket, geen onderdeel van coreutils, en ontbreekt vaak op minimale systemen.
"tree -P verbergt alles wat niet past." Het filtert alleen bestanden; lege mappen blijven zichtbaar tenzij je --prune toevoegt.
"De kleur verdwijnt gewoon als ik de uitvoer opsla." Dat is met opzet: tree laat kleur vallen bij het schrijven naar een pipe of bestand, net als ls.
"Ik kan de tree-uitvoer in mijn script parsen." De getekende lijnen zijn fragiel om te parsen; gebruik in plaats daarvan -J voor JSON of -X voor XML.

9.2 Andere valkuilen om te vermijden

  • Het op het verkeerde niveau uitvoeren. tree / of tree in je thuismap kan miljoenen regels printen. Begrens de diepte altijd met -L totdat je de omvang kent.
  • -a vergeten. Verborgen bestanden zoals .env en .github zijn standaard onzichtbaar, wat juist het ding kan verbergen dat je zoekt.
  • Kapotte kadertekens. Verhaspelde hoeken betekenen een coderingsverschil, geen kapot bestand. Schakel over naar --charset=ascii en de lijnen komen terug.
  • Glob-patronen zonder aanhalingstekens. Een *.py zonder aanhalingstekens wordt eerst door de shell uitgebreid, zodat -P het verkeerde argument krijgt.
  • -s verwarren met maptotalen. -s toont de eigen grootte van elk bestand; alleen --du telt op wat een map bevat.
  • Verwachten dat het bestanden vindt of wijzigt. tree tekent alleen; gebruik find, grep of du als je moet zoeken, lezen of meten.
Naar boven

10. Samenvatting

Het commando tree tekent een map en alles eronder als een enkel ingesprongen diagram, en verandert de onzichtbare vorm van een project in een plaatje dat je in een oogopslag kunt lezen.

  • tree daalt recursief af in elke submap en verbindt items met lijnen: zet een tak voort, ├── markeert een item met meer buren, en └── markeert het laatste.
  • Het is een apart pakket, geen onderdeel van coreutils, dus installeer het met apt, dnf of pacman als het ontbreekt.
  • Bepaal de weergave met -L (diepte), -a (verborgen bestanden), -d (alleen mappen) en --prune (lege takken weglaten).
  • Filter met -P (treffers houden), -I (treffers verbergen) en --gitignore (de negeerregels van het project respecteren).
  • Voeg details toe met -h en --du voor groottes, -p -u -g voor rechten en eigenaren, en -F voor typemarkeringen.
  • Voor machines gebruik je -J voor JSON of -X voor XML; om te delen gebruik je --charset=ascii zodat de lijnen overal weergegeven worden.

Dit is de snelle naslag die het bewaren waard is:

tree                       draw the current directory and everything below
tree -L 2                  stop after two levels deep
tree -a                    include hidden dotfiles
tree -d                    directories only, no files
tree -P '*.py' --prune     keep only .py files, drop empty folders
tree -I 'node_modules|.git'  hide noisy folders
tree --gitignore           respect the project's .gitignore
tree -h --du               human-readable sizes with directory totals
tree -pug                  show permissions, owner, and group
tree -J                    output as JSON for scripts
tree --charset=ascii       portable lines for email and tickets
man tree                   the full manual

Zodra tree in je gereedschapskist zit, houdt een vreemde map op een doolhof te zijn die je een cd tegelijk verkent en wordt het een kaart die je in een oogopslag overziet. Als je servers zijn uitgegroeid tot een wirwar die niemand nog echt voor zich kan zien, is dat helder uittekenen, en het netjes houden, precies het soort werk waarmee ik help.

Naar boven
Linux commando: tree
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.