Linux-Befehl zum Drucken der Verzeichnisstruktur in Form eines Baums

510

Gibt es einen Linux-Befehl, den ich von einem Bash-Skript aus aufrufen kann, das die Verzeichnisstruktur in Form eines Baums druckt, z.

folder1
   a.txt
   b.txt
folder2
   folder3
user243655
quelle
7
Lauf einfach find. Oder find . -not -path '*/\.*'um Dateien und Ordner auszublenden, die mit beginnen .. Wenn Sie eine Ausgabe mit Leerzeichen haben möchten, wie in der Frage, verwenden Sie diese mit diesem Skript "Prettifier suchen":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]"
Benutzer
11
Sollten solche Fragen nicht zu SuperUser migriert und nicht geschlossen werden?
Balmipour
12
Ich denke nicht, dass diese Frage es verdient, als "Off Topic" geschlossen zu werden. Die Tags scheinen richtig zu sein.
Sanket Berde
14
Die Richtlinie, Fragen ohne Migration zu schließen, ist sowohl für den Stapelüberlauf als auch für das menschliche Wissen im Allgemeinen schädlich. In den letzten 3 Tagen wurde jede einzelne Frage, die ich gegoogelt und auf die ich gestoßen bin, aus ähnlichen Gründen geschlossen, und es konnten keine weiteren Aktivitäten stattfinden. Dies bedeutet, dass niemand es aktualisieren kann, niemand eine bessere Antwort geben kann und der Stackoverflow kurzsichtig oder elitär wirkt. Stackoverflow sollte eine Migration in Betracht ziehen, wenn bei einem Thema diese Bedingungen festgestellt werden.
Nein,
5
Ich stimme @NickYeates zu. Ich bin Ende September 2017 hier und finde immer noch Antworten auf dieselbe Frage. Denken Sie langfristig, wenn wir diese Frage- und Antwortrichtlinien entwerfen!
Alex

Antworten:

774

Ist es das, was du für einen Baum suchst ? Es sollte in den meisten Distributionen enthalten sein (möglicherweise als optionale Installation).

~> 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

Beispiel von der Webseite des Betreuers.

Sie können die Option hinzufügen , -L #wo #durch eine Zahl ersetzt wird, die maximale Rekursionstiefe zu spezifizieren.

Entfernen -d, um auch Dateien anzuzeigen.

schlau
quelle
54
Hinweis für jeden Besucher, der dies sieht: Entfernen -d, um auch Dateien anzuzeigen!
Afr
29
Hinweis für jeden Besucher, der dies sieht: Die Manpage listet eine LKW-Ladung weiterer Flaggen für Sie auf :)
oivvio
43
So installieren Sie unter Mac OS X mit Homebrew: brew install tree
Funfuntime
2
So installieren Sie auf Cygwin apt-cyg install tree(vorausgesetzt, Sie haben apt-cyg installiert)
Blockloop
2
Nicht einmal Ubuntu 16.04 kommt damit. Verwendung apt-get install treewird es installieren.
Romeo Sierra
331

Sie können dieses verwenden:

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

In wenigen Sekunden wird eine grafische Darstellung der aktuellen Unterverzeichnisse ohne Dateien angezeigt , z. B /var/cache/.:

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

Quelle

Soufiane Hassou
quelle
7
Wenn Sie es mit Leerzeichen wollen, eher wie das OP angefordert, dann dies: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
Wie kann ich diese Dotfiles ignorieren lassen? ZB verhindern, dass es den Inhalt von auflistet .git?
GMA
@ GeorgeMillo siehe meinen Kommentar
Benutzer
32
Druckt keine Dateien.
Tomáš Zato - Wiedereinsetzung Monica
36
mit Dateien: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Versuchen Sie Folgendes, um Hassous Lösung zu Ihrem .bashrc hinzuzufügen:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
quelle
6
Achten Sie auf das Zeilenumbruchzeichen am Ende der ersten Zeile, wenn Sie dieses direkt kopieren
Rahul
2
Netter Alias. Aber am Ende fehlt '' (2 einfache Anführungszeichen). Es funktioniert auch ohne, aber ... wenn Sie am Ende weitere Befehle hinzufügen möchten, werden Sie feststellen, dass das Literal nicht vollständig ist. Also sollte es gehen alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
7

Mit diesem Befehl werden sowohl Ordner als auch Dateien angezeigt .

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

Beispielausgabe:

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

Quelle: Kommentar von @javasheriff hier . Es wird als Kommentar eingetaucht und als Antwort veröffentlicht, sodass Benutzer es leicht erkennen können.

Pavan Kumar
quelle
für python3 fand ich es find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"gut
patroqueeet
3

Ich verschönere die Ausgabe von @ Hassous Antwort mit:

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

Dies ist der Ausgabe von treejetzt sehr ähnlich :

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

Sie können auch einen Alias ​​daraus machen:

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

Übrigens treeist in einigen Umgebungen wie MinGW nicht verfügbar. Die Alternative ist also hilfreich.

Robert
quelle
Gitbash unter Windows mag den letzten Ausdruck nicht, er besagt, dass er nicht beendet ist
Leos Literak
2

Sie können auch die Kombination der Befehle find und awk verwenden, um den Verzeichnisbaum zu drucken. Weitere Informationen finden Sie unter " Drucken einer mehrstufigen Baumverzeichnisstruktur mit den kombinierten Linux-Befehlen find und awk ".

find . -type d | awk -F'/' '{ 
depth=3;
offset=2;
str="|  ";
path="";
if(NF >= 2 && NF < depth + offset) {
    while(offset < NF) {
        path = path "|  ";
        offset ++;
    }
    print path "|-- "$NF;
}}'
ylspirit
quelle