Comando tree in Linux: directory, filtri e salvataggio in JSON

Il comando tree mostra file e directory in una struttura ad albero. Con -L limiti la profondità, con -d visualizzi solo le directory e con -I escludi i nomi che non ti interessano.

Questa guida riguarda il programma tree per Unix/Linux, con esempi di installazione, filtri, metadati e salvataggio in testo, JSON e XML. Il comando omonimo di Windows ha sintassi e opzioni diverse. Le opzioni disponibili dipendono dalla versione: controlla tree --version e tree --help sul sistema che usi.

Cos'è il comando tree?

tree visita ricorsivamente la directory indicata e rappresenta i rapporti tra file e sottodirectory con rientri e linee. Senza un percorso parte dalla directory corrente, .. Per un esempio completo, scegli una posizione scrivibile in cui tree-demo non esista ancora: i comandi seguenti creano tre sottodirectory e cinque file vuoti di prova, poi visualizzano la struttura.

mkdir tree-demo &&
cd ./tree-demo &&
mkdir config public src &&
touch README.md config/app.conf public/index.html src/main.py src/utils.py &&
LC_ALL=C tree -n --charset=UTF-8

L’output atteso per questa cartella di prova è il seguente. LC_ALL=C rende prevedibile l’ordinamento dei nomi, -n disattiva i colori e --charset=UTF-8 sceglie i caratteri delle linee. I file vuoti servono soltanto a mostrare la gerarchia, non costituiscono un’applicazione eseguibile.

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

3 directories, 5 files

ls è adatto a esaminare gli elementi di una directory; tree rende più immediati i rapporti tra più livelli. Dopo l’esempio ti trovi dentro tree-demo: puoi provare lì le opzioni che non specificano un percorso. Gli altri percorsi riportati nella guida sono esempi e devono esistere sul tuo sistema.

Installazione di tree

tree non è un comando integrato nella shell e potrebbe non essere installato di default a seconda della distribuzione. Per prima cosa, verifica se è installato con il seguente comando.

tree --version

Debian e Ubuntu

sudo apt update
sudo apt install tree

Rocky Linux, AlmaLinux, RHEL e Fedora

sudo dnf install tree

Usa il comando del gestore pacchetti della tua distribuzione; non occorre eseguire tutte le procedure. Dove è ancora previsto yum, l’equivalente è sudo yum install tree. L’installazione richiede i privilegi appropriati e un repository abilitato che fornisca il pacchetto.

Arch Linux

sudo pacman -S tree

Sintassi di base e utilizzo

tree [options] [directory...]

Senza argomenti viene mostrata la directory corrente. Puoi indicare una o più directory, come nelle righe seguenti, che sono esempi indipendenti. I percorsi con ~ partono dalla home; quelli relativi partono dalla posizione corrente.

tree
tree /etc/nginx
tree ~/projects/app
tree src tests

I percorsi con spazi devono essere racchiusi tra virgolette in modo che vengano passati come un unico argomento.

tree "Project Files"

Normalmente il riepilogo finale indica quante directory e quanti file sono stati elencati. --noreport lo omette. Con filtri o limiti non usarlo come inventario completo del disco; il manuale segnala inoltre possibili imprecisioni nei conteggi con -I, -P e --filelimit.

tree --noreport

Scegliere il percorso e la profondità

Visualizza la struttura di una directory specifica

Puoi specificare la directory da controllare come argomento senza cambiare la posizione attuale.

tree /var/www
tree ./src

Indicando il percorso puoi controllare un’altra posizione senza cambiare la directory di lavoro della shell. Usa le virgolette se il percorso contiene spazi.

Limita la profondità massima con -L

Per progetti grandi o directory di sistema, visualizzare tutto può risultare in un output eccessivamente lungo. Specifica la profondità massima da visualizzare dopo -L.

tree -L 1
tree -L 2 /var/www
tree -L 3 ~/projects/app

tree -L 2 mostra al massimo due livelli sotto il punto di partenza. Nella cartella di prova, -L 1 mostra README.md, config, public e src; con -L 2 compaiono anche i file contenuti nelle tre directory. La radice visualizzata non conta come primo livello.

Includere i file nascosti o mostrare solo le directory

Includi i file nascosti con -a

Di norma i nomi che iniziano con un punto sono esclusi. -a include file e directory nascosti, come .env o .gitignore, ma non le voci speciali . e ... La cartella di prova iniziale non contiene nomi nascosti, quindi su quella struttura -a non aggiunge elementi.

tree -a
tree -a -L 2

Quando si condividono i nomi dei file di configurazione o le strutture delle directory all'esterno, assicurarsi che non vengano esposte informazioni sensibili. -a mostra i nomi, non i contenuti, ma i nomi stessi possono essere sensibili.

Mostra solo le directory con -d

Per controllare solo la struttura delle cartelle escludendo i file, usare -d.

tree -d
tree -d -L 3 /var/www

Nell’esempio iniziale tree -d mostra solo config, public e src sotto la radice. Questa vista è utile per descrivere l’organizzazione dei moduli o delle cartelle di backup.

Includere o escludere per nome file

I pattern di -P e -I sono espressioni con caratteri jolly: per esempio *.py indica nomi che terminano con .py. Racchiudili tra apici singoli affinché sia tree, e non la shell, a interpretarli. Il carattere | separa pattern alternativi.

Mostra solo i file corrispondenti con -P

-P seleziona i file che corrispondono al pattern. Le directory possono rimanere visibili per conservare il contesto; l’opzione non equivale a filtrare ogni nome di directory con la stessa regola.

tree -P '*.py'
tree -P '*.jpg|*.png|*.webp'

Aggiungi --prune per eliminare dall’output le directory che rimangono vuote dopo il filtro. Nella cartella di prova la combinazione seguente mantiene il ramo src con main.py e utils.py, escludendo gli altri rami.

tree -P '*.py' --prune

Per includere file nascosti nel controllo del modello, è necessario inoltre -a.

Escludere elementi non necessari con -I

-I omette dall’output i file e le directory che corrispondono al pattern. Escludere dipendenze, risultati di compilazione e cache rende più leggibile la struttura di un progetto.

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

-I esclude i file solo dalla visualizzazione, senza eliminarli.

Applicare le regole Git con --gitignore

Nelle versioni che la supportano, --gitignore applica le regole dei file .gitignore. Può cercare tali file anche nelle directory superiori al punto di partenza e utilizzare .git/info/exclude o il file indicato tramite GIT_DIR. Il risultato dipende quindi anche dalle regole presenti fuori dalla directory visualizzata.

tree --gitignore
tree -a --gitignore -L 3

Controlla in tree --help che l’opzione sia disponibile. Le regole Git non sostituiscono la revisione dell’output prima di condividerlo: un nome non ignorato può comunque essere riservato.

Dimensioni, permessi e data di modifica

Dimensioni dei file e totali delle directory

-s mostra le dimensioni in byte; -h le mostra direttamente in unità leggibili, senza richiedere -s. I suffissi K, M e G di -h usano potenze di 1024; --si usa invece potenze di 1000.

tree -s
tree -h

--du accumula per ogni directory le dimensioni dei file e delle sottodirectory e implica -s. Puoi combinarlo con -h. Questi valori non vanno confusi con una misura precisa dei blocchi effettivamente allocati sul disco: file sparsi, collegamenti e criteri di esplorazione possono rendere diverso il risultato di strumenti dedicati all’uso del disco.

tree --du -h -L 2

La combinazione con -L 2 mantiene compatta la vista. Non dedurre da una vista filtrata o limitata che ogni elemento del disco sia stato considerato: verifica la versione e il perimetro della scansione prima di usare i totali per decisioni di spazio. Il calcolo con --du raccoglie l’albero prima di stamparlo e può aumentare sensibilmente tempi e memoria.

Permessi, proprietario e date

-p mostra tipo e permessi, -u il proprietario e -g il gruppo. -D aggiunge la data dell’ultima modifica del contenuto; se usi anche -c, la data mostrata riguarda invece l’ultima variazione dello stato del file, non la sua creazione.

tree -p
tree -pug
tree -pugD -L 2

Quando si indagano problemi di permessi, è possibile vedere sia la struttura che i metadati, ma se ci sono nomi utente e percorsi molto lunghi, la larghezza dell'output potrebbe diventare ampia.

Ordinamento e formato dei percorsi

Mostra e ordina prima le directory

--dirsfirst posiziona le directory prima dei file. -t ordina per data di modifica, --sort=size ordina per dimensione e -r inverte l'ordine dei risultati.

tree --dirsfirst
tree -t
tree --sort=size -r

-U disattiva l’ordinamento e usa l’ordine fornito dalla directory del file system, che non va interpretato come ordine cronologico. Disattiva anche --dirsfirst e l’inversione con -r.

Ottenere elenchi di percorsi senza linee

-f antepone il percorso di partenza al nome di ciascun elemento; -i elimina le linee e i rientri dell’albero. Il prefisso non è necessariamente un percorso assoluto: con tree -f ./src rimane basato su ./src. Usa un punto di partenza assoluto se ti servono percorsi assoluti.

tree -f
tree -fi --noreport

-fi --noreport è utile per un elenco da leggere, ma non costituisce un formato universale per passare nomi di file ad altri comandi: caratteri speciali, escape e indicazioni dei collegamenti simbolici richiedono attenzione. Per elaborare strutture complesse preferisci JSON o XML e un parser adatto.

Salvare i risultati in un file e in formato strutturato

Salva come file di testo

-o salva l’output in un file. Per provare gli esempi seguenti, dalla cartella tree-demo torna prima alla sua directory padre con cd ... I file di risultato sono così esterni all’albero osservato e non possono comparire nella sua struttura. Scegli nomi che non esistano ancora: -o e la redirezione > possono sovrascrivere un file esistente.

tree -n -L 3 ./tree-demo -o tree-demo-structure.txt
tree -a -I '.git|node_modules' --noreport ./tree-demo -o tree-demo-filtered.txt

In alternativa usa la redirezione della shell. -n disattiva i colori; se passi esplicitamente anche -C, quest’ultima opzione li forza nuovamente. Il file seguente ha un nome distinto da quelli degli esempi precedenti.

tree -n -L 3 ./tree-demo > tree-demo-redirect.txt

Output in JSON e XML

-J produce una struttura JSON, mentre -X produce XML. Questi esempi partono ancora dalla directory padre di tree-demo e salvano i risultati all’esterno della cartella esaminata.

tree -J -L 3 ./tree-demo > tree-demo-structure.json
tree -X -L 3 ./tree-demo > tree-demo-structure.xml

Apri il file generato con un parser JSON o XML e verifica radice, nomi e livelli prima di integrarlo in un programma. Formato e campi possono cambiare con la versione. --noreport omette il riepilogo dei conteggi anche dagli output strutturati: usalo se vuoi ricevere soltanto la gerarchia.

Collegamenti simbolici e confini del file system

Decidere se seguire i link simbolici

Per impostazione predefinita, i collegamenti simbolici mostrano il nome del collegamento e il percorso di destinazione, ma non entrano nelle directory a cui puntano. L'uso di -l segue i collegamenti simbolici che puntano alle directory.

tree -l -L 3

Seguire i collegamenti può estendere la scansione oltre il ramo che ti aspettavi di visitare. Associa -l a un limite di profondità; tree evita i collegamenti ricorsivi che riesce a rilevare, ma controlla comunque l’ampiezza e la durata dell’esplorazione.

Rimani sul filesystem corrente con -x

-x impedisce di spostarsi in un filesystem diverso dalla directory iniziale. È utile per limitare l'intervallo di esplorazione su server con molti punti di mount.

tree -x -L 3 /

Anche quando si punta alla directory principale, i percorsi senza autorizzazione non possono essere letti e stampare la struttura dell'intero sistema può produrre risultati molto grandi.

Combinazioni di comandi tree usate frequentemente

Comando Scopo
tree Visualizza i file e le sottodirectory della directory corrente come un albero.
tree -L 2 Visualizza solo fino a due livelli dalla posizione corrente.
tree -a Include anche file e directory nascosti.
tree -d Visualizza solo le directory, escludendo i file.
tree -I 'node_modules|.git' Esclude file e directory che corrispondono al modello specificato.
tree -P '*.py' --prune Mostra i rami che contengono file Python.
tree -h --du -L 2 Mostra la dimensione cumulativa delle directory fino a due livelli in un formato leggibile.
tree -pugD Mostra permessi, utente, gruppo e ora di modifica insieme.
tree -fi --noreport Elenca percorsi con il prefisso di partenza, senza linee dell’albero né riepilogo.
tree -J -L 3 Visualizza la struttura fino a tre livelli come JSON.

Riepilogo delle principali opzioni

Opzione Descrizione
-a Includi file e directory nascosti che iniziano con un punto.
-d Visualizza solo le directory.
-L number Limita la profondità massima delle directory da visualizzare.
-P pattern Seleziona i file che corrispondono al modello wildcard.
-I pattern Esclude file e directory che corrispondono al modello wildcard.
--prune Rimuove le directory vuote dall'output dopo l'applicazione dei filtri.
--gitignore Utilizza le regole di esclusione dei file di Git per il filtraggio.
-f Antepone a ogni nome il percorso di partenza; il risultato può essere relativo.
-h Mostra le dimensioni dei file in unità leggibili.
--du Calcola le dimensioni cumulative per directory.
-p Visualizza tipi di file e permessi.
-D Mostra l'ultima data di modifica.
--dirsfirst Ordina le directory prima dei file.
-J Restituisce in formato JSON.
-X Restituisce in formato XML.
-o FILE Salva l'output nel file specificato.
-l Segui i collegamenti simbolici che puntano a directory.
-x Cerca solo all'interno dello stesso filesystem della posizione iniziale.
--noreport Ometti il riepilogo del numero di file e directory alla fine.

Precauzioni per directory di grandi dimensioni

Limita prima la profondità e i filtri

Per alberi grandi parti da una directory mirata, limita la profondità con -L ed escludi i rami non pertinenti con -I o --gitignore. Aumenta gradualmente il perimetro solo se l’output iniziale è insufficiente.

Comprendere il costo di --du e --prune

--du e --prune potrebbero dover raccogliere l'intero albero in memoria prima di produrre risultati. In directory molto grandi, l'output potrebbe essere ritardato e l'uso della memoria potrebbe aumentare.

Controllare errori di permesso e nomi sensibili

Le directory per le quali l'utente corrente non ha permessi di lettura o di navigazione non saranno visualizzate completamente. Eseguire semplicemente come amministratore per vedere l'intera struttura può espandere l'accesso inutilmente, quindi controlla prima i percorsi e i permessi necessari.

Prima di allegare il risultato a una documentazione o a una segnalazione, cerca nomi utente, percorsi interni, nomi di file riservati e nomi in codice del progetto. Le opzioni di esclusione modificano la visualizzazione, senza cancellare i file originali.

FAQ

tree: comando non trovato - perché si verifica questo errore?

Questo accade perché tree non è installato oppure il percorso eseguibile non è in PATH. Installa il pacchetto tree utilizzando il gestore pacchetti della tua distribuzione e verifica con tree --version.

Come posso visualizzare le sottodirectory fino a solo due livelli?

Usa tree -L 2. Per controllare un percorso diverso, specifica la directory alla fine come tree -L 2 /path/to/check.

Posso escludere contemporaneamente le directory node_modules e .git?

Usa tree -I 'node_modules|.git'. Racchiudere il modello tra virgolette singole impedisce alla shell di interpretare prima la barra verticale o i caratteri jolly.

Come posso formattare bene l'output dell'albero per un README?

Limita la profondità e le esclusioni come tree -L 3 -I '.git|node_modules|dist' --noreport. Dopo esserti assicurato che l'output non contenga percorsi interni o nomi di file sensibili, puoi inserirlo in un blocco di codice per preservare la struttura.

Documentazione di riferimento