Linux命令以树形式打印目录结构


510

我可以从Bash脚本中调用任何Linux命令吗,它将以树的形式打印目录结构,例如,

folder1
   a.txt
   b.txt
folder2
   folder3

7
快跑find。或者find . -not -path '*/\.*'隐藏以开头的文件和文件夹.。如果要输出带有空格的输出(如问题所示),请将此输出与此“查找前缀”脚本一起使用: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]"
用户

11
这样的问题不应该迁移到SuperUser而不是封闭吗?
Balmipour 2015年

12
我认为这个问题不应该作为“题外话”结束。标签似乎是正确的。
Sanket Berde 2015年

14
一般而言,关闭问题而不进行迁移的策略对堆栈溢出和人类知识都是有害的。在过去的三天内,我用类似的理由对我在Google上搜索并遇到的每一个问题都关闭了,再也无法进行任何活动了。这意味着没有人可以更新它,没有人可以给出更好的答案,这使得stackoverflow看起来是短视的或精英的。当发现主题具有这些条件时,Stackoverflow应该考虑要求迁移。
2013年

5
我同意@NickYeates,我在2017年9月下旬仍在此问题的答案中。设计这些问答政策时,请长远考虑!
亚历克斯

Answers:


773

这是您要寻找的吗?它应该在大多数发行版中(可能是可选安装)。

~> 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以显示文件。


54
请注意以下内容的任何访客:删除-d以显示文件!
2013年

29
请注意以下内容的所有访客注意:手册页为您列出了更多标志的卡车:)
oivvio 2014年

42
要在带有Homebrew的Mac OS X上安装: brew install tree
funfuntime 2014年

2
要在cygwin上安装apt-cyg install tree(假设您已经安装了apt-
cyg

2
甚至没有Ubuntu 16.04附带。使用apt-get install tree将安装它。
罗密欧·塞拉

331

您可以使用以下一种:

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

资源


7
如果你用空格想要的话,更像是OP的要求,那么这样的: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'

有什么办法可以使我忽略点文件?例如防止它列出的内容.git
GMA 2014年

@GeorgeMillo看到我的评论
用户

32
不打印文件。
托马什Zato -恢复莫妮卡

36
与文件: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff

18

要将Hassou的解决方案添加到您的.bashrc,请尝试:

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

6
如果直接复制此行,请注意第一行末尾的换行符
Rahul

2
很好的别名。但是结尾缺少''(2个单引号字符)。即使没有它,它也可以工作,但是...如果您想在末尾添加更多命令,您将看到文字不完整。所以应该走了 alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
屈Hero(Hero Qu)

6

此命令可显示文件夹和文件

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评论这里。将其淹没为评论,并将其发布为答案可帮助用户轻松发现它。


for python3我发现find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"效果很好
patroqueeet

3

我正在用@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/├/└/\''

BTW tree在某些环境(例如MinGW)中不可用。因此,替代方案是有帮助的。


Windows上的gitbash不喜欢最后一个表达式,它说它没有终止
Leos Literak

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.