Linux commando: tree
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.
Naar bovenHet juiste mentale model:
lsgeeft je een verdieping van een gebouw tegelijk, terwijltreeje de hele plattegrond in een keer geeft. Je verliest de fijne details die een langels -ltoont, maar je wint de vorm, en de vorm is meestal waar je voor kwam.
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.
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:
| Tijdperk | Mijlpaal |
|---|---|
| 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 boven4. 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 boven5. 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.
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.
6.6 Symbolische links volgen
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.
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:
| Behoefte | Gebruik | Waarom |
|---|---|---|
| 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.
8. Beste praktijken
- Begin ondiep met
-L. Voer bij elke onbekende map eersttree -L 2uit 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
--gitignorein 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', niettree -P *.log, anders breidt de shell de glob uit voordattreehem ziet. - Gebruik
--charset=asciials je deelt. Voor een e-mail, ticket of README overleven platte ASCII-lijnen elke codering; de mooie kadertekens misschien niet. - Grijp naar
-Jvoor 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.
treeis geen onderdeel van coreutils, dus een verse server of container heeft vaak eerstapt install treenodig.
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 boven9. Veelgemaakte fouten
9.1 Vier veelvoorkomende mythes
| Mythe | Werkelijkheid |
|---|---|
"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 /oftreein je thuismap kan miljoenen regels printen. Begrens de diepte altijd met-Ltotdat je de omvang kent. -avergeten. Verborgen bestanden zoals.enven.githubzijn 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=asciien de lijnen komen terug. - Glob-patronen zonder aanhalingstekens. Een
*.pyzonder aanhalingstekens wordt eerst door de shell uitgebreid, zodat-Phet verkeerde argument krijgt. -sverwarren met maptotalen.-stoont de eigen grootte van elk bestand; alleen--dutelt op wat een map bevat.- Verwachten dat het bestanden vindt of wijzigt.
treetekent alleen; gebruikfind,grepofduals je moet zoeken, lezen of meten.
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.
treedaalt 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,dnfofpacmanals 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
-hen--duvoor groottes,-p -u -gvoor rechten en eigenaren, en-Fvoor typemarkeringen. - Voor machines gebruik je
-Jvoor JSON of-Xvoor XML; om te delen gebruik je--charset=asciizodat 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.


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


