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
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
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:
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.
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í
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 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.