755 Stimmen

Linux-Befehl zum Ausdrucken der Verzeichnisstruktur in Form eines Baums

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

folder1
   a.txt
   b.txt
folder2
   folder3

22voto

RussellStewart Punkte 5143

Um Hassous Lösung zu Ihrer .bashrc hinzuzufügen, versuchen Sie es:

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

13voto

Die beste Antwort ist natürlich "Baum". Aber, um andere Antworten zu verbessern, die sich auf das Greifen der Ausgabe von ls -R Hier ist ein Shell-Skript, das awk benutzt, um einen Baum von Unterverzeichnissen zu drucken. Zunächst ein Beispiel für die Ausgabe:

.
 matching
     bib
     data
        source
            html
     data
        plots
     method
        info
        soft
            imgs
               ascii
               symbol
            js
     ms

Dann der Code:

ls -qLR 2>/dev/null \
| grep '^./' \
| sed -e 's,:$,,' \
| awk '
    function tip(new) { stem = substr(stem, 1, length(stem) - 4) new }
    {
        path[NR] = $0
    }
    END {
        elbow = " "; pipe = "   "; tee = " "; blank = "    "
        none = ""
        #
        # Model each stem on the previous one, going bottom up.
        for (row = NR; row > 0; row--) {
            #
            # gsub: count (and clean) all slash-ending components; hence,
            # reduce path to its last component.
            growth = gsub(/[^/]+\//, "", path[row]) - slashes
            if (growth == 0) {
                tip(tee)
            }
            else if (growth > 0) {
                if (stem) tip(pipe) # if...: stem is empty at first!
                for (d = 1; d < growth; d++) stem = stem blank
                stem = stem elbow
            }
            else {
                tip(none)
                below = substr(stem, length(stem) - 4, 4)
                if (below == blank) tip(elbow); else tip(tee)
            }
            path[row] = stem path[row]
            slashes += growth
        }
        root = "."; print root
        for (row = 1; row <= NR; row++) print path[row]
    }
'

Der Code führt zu besser aussehenden Ergebnissen als andere Lösungen, da in einem Baum von Unterverzeichnissen die Dekorationen in jedem Zweig von den Zweigen darunter abhängen. Daher müssen wir die Ausgabe von ls -R in umgekehrter Reihenfolge, von der letzten Zeile zur ersten.

Eine Shell-Funktion, die auf diesem Code basiert (mit einigen Optionen), finden Sie hier:

https://github.com/ftonneau/t.sh

9voto

Robert Punkte 1657

Ich verschönere die Ausgabe von @Hassou's Antwort mit:

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

Dies entspricht in etwa der Ausgabe von tree jetzt:

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

Sie können auch einen Alias dafür erstellen:

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

ÜBRIGENS, tree ist in einigen Umgebungen, wie MinGW, nicht verfügbar. Die Alternative ist also hilfreich.

6voto

Raj kamal Punkte 51

Durch Hinzufügen der folgenden Funktion in bashrc können Sie den Befehl ohne Argumente ausführen, der die aktuelle Verzeichnisstruktur anzeigt, und wenn er mit einem beliebigen Pfad als Argument ausgeführt wird, wird die Verzeichnisstruktur dieses Pfades angezeigt. Auf diese Weise müssen Sie vor der Ausführung des Befehls nicht in ein bestimmtes Verzeichnis wechseln.

function tree() {
    find ${1:-.} | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"
}

Dies funktioniert auch in der Gitbash.

Quelle: Kommentar von @javasheriff aquí

5voto

ylspirit Punkte 31

Sie können auch die Kombination der Befehle find und awk verwenden, um den Verzeichnisbaum zu drucken. Einzelheiten dazu finden Sie unter " Wie man mit den kombinierten Befehlen find und awk eine mehrstufige Baumstruktur ausgibt "

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;
}}'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X