跟老男孩学Linux运维:核心系统命令实战
上QQ阅读APP看书,第一时间看更新

2.3 tree:以树形结构显示目录下的内容

2.3.1 命令详解

【命令星级】 ★★★★☆

【功能说明】

tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容,包括所有文件、子目录及子目录里的目录和文件。

【语法格式】

tree  [option]  [directory]
tree  [选项]    [目录]

说明:

1)注意tree命令以及后面的选项和目录,每个元素之间都至少要有一个空格。

2)tree命令后若不接选项和目录就会默认显示当前所在路径目录的目录结构。

【选项说明】

表2-4针对该命令的参数选项进行了说明。

表2-4 tree命令的参数选项及说明

2.3.2 使用范例

在讲解范例之前,先做一些准备工作,步骤如下。

第一步,安装tree命令。

首先检查系统是否安装了tree命令,如果采用的是最小化安装Linux系统的方式,那么tree命令有可能没有安装。此时可用yum命令安装tree命令:

[root@oldboy ~]# rpm -qa tree            #<==查询tree命令是否安装。
tree-1.5.3-2.el6.x86_64                  #<==如果没有显示就执行下面的命令。
[root@oldboy ~]# yum -y install tree      #<==安装tree命令的yum命令。

第二步,调整系统字符集,防止树形结构显示乱码。

在使用树形结构时,很可能会因为字符集导致出现乱码问题,比如导致树形的树枝部分都是问号,例如:

[root@oldboy ~]# tree /boot/
/boot/
├── config-2.6.32-573.el6.x86_64
├── efi
│?? └── EFI
│??     └── redhat
│??         └── grub.efi

下面的命令为临时解决树结构乱码的方法:

[root@oldboy ~]# LANG=en_US.UTF-8

这个问题与Linux系统字符集以及我们连接Linux客户端的字符集都有关联。

1.基础范例

范例2-9:不带任何参数执行tree命令。

[root@oldboy etc]# cd ~
[root@oldboy ~]# tree        #<==显示当前目录的结构。
.       #<==“.”以当前目录为起点。
├── anaconda-ks.cfg
├── install.log
└── install.log.syslog
0 directories, 3 files

范例2-10:以树形结构显示目录下的所有内容(-a的功能)。

[root@oldboy ~]# tree -a      #<==带-a参数显示所有文件(包括隐藏文件)。
.
├── anaconda-ks.cfg
├── .bash_history      #<==在Linux系统中,以“.”点号开头的文件为隐藏文件,默认不显示。
├── .bash_logout
├── .bash_profile
├── .bashrc
├── .cshrc
├── install.log
├── install.log.syslog
├── .mysql_history
├── .tcshrc
└── .viminfo
0 directories, 11 files
#<==上述命令结果仅供参考,能看到加粗的以点开头的隐藏文件即可,列表内容的名字因为系统的不同多少可能会有些区别。

范例2-11:只列出根目录下第一层目录的结构(-L功能)。

[root@oldboy ~]# tree -L 1 /       #<==-L参数后接数字,表示查看目录的层数,不带-L选项默
                                   认显示所有层数。
/
├── bin
├── boot
...省略若干行...
├── sys
├── tmp
├── usr
└── var
20 directories, 0 files

范例2-12:只显示所有的目录(但不显示文件)。

[root@oldboy ~]# tree -d /etc/   #<==-d参数表示只显示目录。
/etc/
|-- ConsoleKit
|   |-- run-seat.d
|   |-- run-session.d
|   '-- seats.d
|-- NetworkManager
|   '-- dispatcher.d
……省略若干行
[root@oldboy ~]# tree -dL 1 /etc/  #<==-d参数只显示目录,-L参数显示层数,这里是1层。
/etc/
|-- ConsoleKit
|-- NetworkManager
|-- X11
……省略若干行

范例2-13:-f选项和-i选项的使用。

使用-f选项可显示完整的路径名称,使用-i选项则不显示树枝部分,示例代码如下:

[root@oldboy ~]# tree -L 1 -f /boot/         #<==-f显示内容的完整路径。
/boot
├── /boot/config-2.6.32-504.el6.x86_64
├── /boot/efi
├── /boot/grub
├── /boot/initramfs-2.6.32-504.el6.x86_64.img
├── /boot/lost+found
├── /boot/symvers-2.6.32-504.el6.x86_64.gz
├── /boot/System.map-2.6.32-504.el6.x86_64
└── /boot/vmlinuz-2.6.32-504.el6.x86_64
3 directories, 5 files
[root@oldboy ~]# tree -L 1 -fi /boot/            #<==-i不显示“树枝”,当需要获取所有
                                               文件的完整路径时,这个命令很好用。
/boot
/boot/config-2.6.32-504.el6.x86_64
/boot/efi
/boot/grub
/boot/initramfs-2.6.32-504.el6.x86_64.img
/boot/lost+found
/boot/symvers-2.6.32-504.el6.x86_64.gz
/boot/System.map-2.6.32-504.el6.x86_64
/boot/vmlinuz-2.6.32-504.el6.x86_64
3 directories, 5 files

2.技巧性范例

范例2-14:使用tree命令区分目录和文件的方法(常用)。

[root@oldboy ~]# tree -L 1 -F /boot/      #<==使用-F参数会在目录后面添加“/”,方便区
                                         分目录。
/boot/
├── config-2.6.32-504.el6.x86_64
├── efi/
├── grub/
├── initramfs-2.6.32-504.el6.x86_64.img
├── lost+found/
├── symvers-2.6.32-504.el6.x86_64.gz
├── System.map-2.6.32-504.el6.x86_64
└── vmlinuz-2.6.32-504.el6.x86_64*
[root@oldboy ~]# tree -L 1 -F /boot/|grep /$      #<==过滤以斜线结尾的所有内容,如果大
                                              家看不懂这个方法,那么建议等学完
                                              grep命令再回头来看。
/boot/
|-- efi/
|-- grub/
|-- lost+found/
3 directories, 5 files
[root@oldboy ~]# tree -L 1 -d /boot/      #<==使用-d参数只显示目录树,这样可轻松过滤内
                                        容中的目录。
/boot/
|-- efi
|-- grub
'-- lost+found
3 directories