Comando Linux per stampare la struttura delle directory sotto forma di un albero


510

Esiste un comando linux che posso chiamare da uno script Bash che stamperà la struttura della directory sotto forma di un albero, ad esempio,

folder1
   a.txt
   b.txt
folder2
   folder3

7
Corri e basta find. O find . -not -path '*/\.*'per nascondere file e cartelle che iniziano con .. Se vuoi avere un output con spazi, come nella domanda, usalo con questo script "trova prettifier":find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
user

11
Tali domande non dovrebbero essere migrate su SuperUser piuttosto che essere chiuse?
Balmipour,

12
non credo che questa domanda meriti di essere chiusa come "off topic". I tag sembrano essere corretti.
Sanket Berde,

14
La politica di chiusura delle domande senza migrare è dannosa sia per lo stackoverflow che per la conoscenza umana in generale. Negli ultimi 3 giorni, ogni singola domanda che ho cercato su Google e che ho incontrato è stata chiusa per ragionamenti simili e non è stata più possibile svolgere alcuna attività. Ciò significa che nessuno può aggiornarlo, nessuno può dare una risposta migliore e fa apparire StackOverflow miope o elitario. Stackoverflow dovrebbe considerare la necessità di richiedere una migrazione quando viene trovato un argomento con queste condizioni.
No,

5
Sono d'accordo con @NickYeates Sono qui alla fine di settembre 2017 ancora trovando le risposte a questa stessa domanda. Pensa a lungo termine quando progettiamo queste politiche di domande e risposte!
Alex,

Risposte:


774

È questo quello che stai cercando albero ? Dovrebbe essere nella maggior parte delle distribuzioni (forse come installazione opzionale).

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

campione tratto dalla pagina Web del manutentore.

È possibile aggiungere l'opzione in -L #cui #è sostituito da un numero, per specificare la profondità massima di ricorsione.

Rimuovi -dper visualizzare anche i file.


54
Nota per ogni visitatore che vede questo: rimuovi anche -dper visualizzare i file!
Afr

29
Nota per ogni visitatore che vede questo: la pagina man elenca un camion di più bandiere per te :)
oivvio,

43
Per installare su Mac OS X con Homebrew: brew install tree
funfuntime il

2
Per installare su cygwin apt-cyg install tree(supponendo che tu abbia installato apt-cyg)
blockloop

2
Neanche Ubuntu 16.04 viene fornito con questo. Use apt-get install treelo installerà.
Romeo Sierra,

331

Puoi usare questo:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'

Mostrerà in pochi secondi una rappresentazione grafica delle sottodirectory correnti senza file , ad es. In /var/cache/:

   .
   |-apache2
   |---mod_cache_disk
   |-apparmor
   |-apt
   |---archives
   |-----partial
   |-apt-xapian-index
   |---index.1
   |-dbconfig-common
   |---backups
   |-debconf

fonte


7
Se lo vuoi con spazi, più come richiesto dall'OP, allora questo: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben

in qualche modo posso fare in modo che ignori i dotfile? Ad esempio impedirgli di elencare il contenuto di .git?
GMA,

@GeorgeMillo vedi il mio commento
utente

32
Non stampa i file.
Tomáš Zato - Ripristina Monica il

36
con file: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff

18

Per aggiungere la soluzione Hassou al tuo .bashrc, prova:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"

6
Fai attenzione al personaggio newline alla fine della prima riga se copi questo direttamente
Rahul

2
Bello alias. Ma alla fine manca '' (2 caratteri a virgoletta singola). Funziona anche senza di essa, ma ... se vuoi aggiungere altri comandi alla fine vedrai che il valore letterale non è completo. Quindi dovrebbe andare alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu

7

Questo comando funziona per visualizzare sia le cartelle che i file .

find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

Esempio di output:

.
 |-trace.pcap
 |-parent
 | |-chdir1
 | | |-file1.txt
 | |-chdir2
 | | |-file2.txt
 | | |-file3.sh
 |-tmp
 | |-json-c-0.11-4.el7_0.x86_64.rpm

Fonte: commento da @javasheriff qui . È sommerso come un commento e pubblicandolo come risposta aiuta gli utenti a individuarlo facilmente.


per python3 ho trovato che find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"funziona bene
patroqueeet

3

Sto preparando l'output della risposta di @ Hassou con:

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'

Questo è molto simile all'output di treenow:

.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh

Puoi anche crearne uno alias:

alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''

A proposito, treenon è disponibile in alcuni ambienti, come MinGW. Quindi l'alternativa è utile.


gitbash su windows non piace l'ultima espressione, dice che non è terminato
Leos Literak

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.