是否有任何linux命令可以从Bash脚本中调用,该脚本将以树的形式打印目录结构,例如,
folder1
a.txt
b.txt
folder2
folder3
答案 0 :(得分:694)
这是你在寻找tree的内容,应该在大多数发行版中(可能作为可选安装)?
~> 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
来自维护者网页的样本。
您可以添加-L #
选项,其中#
被数字替换,以指定最大递归级别。
删除-d
以显示文件。
答案 1 :(得分:282)
你可以使用这个:
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
它将显示当前子目录的图形表示,没有文件几秒钟,例如在 / var / cache / :
.
|-apache2
|---mod_cache_disk
|-apparmor
|-apt
|---archives
|-----partial
|-apt-xapian-index
|---index.1
|-dbconfig-common
|---backups
|-debconf
答案 2 :(得分:18)
此命令可显示文件夹和文件。
find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
示例输出:
.
|-trace.pcap
|-parent
| |-chdir1
| | |-file1.txt
| |-chdir2
| | |-file2.txt
| | |-file3.sh
|-tmp
| |-json-c-0.11-4.el7_0.x86_64.rpm
来源: @javasheriff here的评论。它淹没在评论中,然后张贴为答案,可以帮助用户轻松发现它。
答案 3 :(得分:14)
要将Hassou的解决方案添加到.bashrc,请尝试:
alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"
答案 4 :(得分:3)
您还可以结合使用find和awk命令来打印目录树。有关详细信息,请参阅“ How to print a multilevel tree directory structure using the linux find and awk combined commands”
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;
}}'
答案 5 :(得分:3)
在bashrc中添加以下功能可让您运行不带任何参数的命令,该命令显示当前目录结构,当以任何路径作为参数运行时,将显示该路径的目录结构。这样可以避免在运行命令之前切换到特定目录。
function tree() {
find ${1:-.} | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
}
这也可以在gitbash中使用。
来源:@javasheriff here
的评论答案 6 :(得分:2)
由于评论成功,因此我将其添加为答案:
带有文件:
find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
答案 7 :(得分:1)
我要用@Hassou的答案来美化输出:
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'
这很像现在tree
的输出:
.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh
您也可以为其别名:
alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''
顺便说一句,tree
在某些环境(例如MinGW)中不可用。因此,替代方法很有帮助。
答案 8 :(得分:1)
由于我对其他答案(非tree
)的输出不太满意(请参阅my comment at Hassou's answer),因此我尝试模仿tree
的输出。
这与罗伯特(Robert)的答案类似,但水平线并非全部始于起点,而是应从起点开始。虽然必须使用perl
,但是在我的情况下,在我没有tree
的系统上,perl
可用。
ls -aR | grep ":$" | perl -pe 's/:$//;s/[^-][^\/]*\// /g;s/^ (\S)/└── \1/;s/(^ | (?= ))/│ /g;s/ (\S)/└── \1/'
输出(缩短):
.
└── fd
└── net
│ └── dev_snmp6
│ └── nfsfs
│ └── rpc
│ │ └── auth.unix.ip
│ └── stat
│ └── vlan
└── ns
└── task
│ └── 1310
│ │ └── net
│ │ │ └── dev_snmp6
│ │ │ └── rpc
│ │ │ │ └── auth.unix.gid
│ │ │ │ └── auth.unix.ip
│ │ │ └── stat
│ │ │ └── vlan
│ │ └── ns
我们建议避免使用多余的垂直线:-)
在Hassou的答案评论中,我仍然非常喜欢Ben's solution,如果没有(不是完全正确的)行,它会更干净。对于我的用例,我还删除了全局缩进,并向ls
隐藏文件中添加了选项,如下所示:
ls -aR | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g'
输出(缩短得更多):
.
fd
net
dev_snmp6
nfsfs
rpc
auth.unix.ip
stat
vlan
ns