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
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
Antworten:
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.
-d
, um auch Dateien anzuzeigen!
brew install tree
apt-cyg install tree
(vorausgesetzt, Sie haben apt-cyg installiert)
apt-get install tree
wird es installieren.
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
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
.git
?
find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
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/-/|/'"'"
alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
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.
find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
gut
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 tree
jetzt 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 tree
ist in einigen Umgebungen wie MinGW nicht verfügbar. Die Alternative ist also hilfreich.
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;
}}'
find
. Oderfind . -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]"