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

时间:2010-08-11 05:58:01

标签: linux command-line

是否有任何linux命令可以从Bash脚本中调用,该脚本将以树的形式打印目录结构,例如,

folder1
   a.txt
   b.txt
folder2
   folder3

9 个答案:

答案 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

Source

答案 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