1. 命令概述
- 命令名称:
tree(英文全拼:tree) - 核心功能:以树状图形式列出目录内容
- 主要用途:递归显示目录结构,直观展示文件和子目录的层次关系
- 特点:支持多种输出格式,可显示文件权限、大小、时间等信息
2. 语法格式
tree [选项] [目录名]
3. 常用选项
| 选项 | 说明 |
|---|---|
-a | 显示所有文件和目录(包括隐藏文件) |
-d | 只显示目录 |
-f | 显示完整路径 |
-i | 不显示树状结构,只显示文件列表 |
-l | 跟随符号链接 |
-p | 显示文件权限 |
-s | 显示文件大小 |
-u | 显示文件所有者 |
-g | 显示文件所属组 |
-D | 显示文件修改时间 |
-t | 按修改时间排序 |
-r | 按修改时间倒序排序 |
-n | 不显示颜色 |
-C | 显示颜色 |
-L | 限制目录深度 |
-I | 忽略指定模式的文件 |
-P | 只显示匹配指定模式的文件 |
-F | 在文件后添加标识符 |
-q | 用问号代替不可打印字符 |
-N | 直接显示文件名,不处理控制字符 |
-o | 将结果输出到文件 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 基本操作
(1) 基本目录树显示
# 显示当前目录的树状结构
tree
# 显示指定目录的树状结构
tree /path/to/dir
# 显示多个目录的树状结构
tree dir1 dir2 dir3
# 显示根目录的树状结构
tree /
(2) 显示隐藏文件
# 显示所有文件和目录(包括隐藏文件)
tree -a
# 显示指定目录的所有文件和目录
tree -a /path/to/dir
# 显示多个目录的所有文件和目录
tree -a dir1 dir2 dir3
(3) 只显示目录
# 只显示目录
tree -d
# 只显示指定目录的目录结构
tree -d /path/to/dir
# 只显示多个目录的目录结构
tree -d dir1 dir2 dir3
(4) 显示完整路径
# 显示完整路径
tree -f
# 显示指定目录的完整路径
tree -f /path/to/dir
# 显示多个目录的完整路径
tree -f dir1 dir2 dir3
(5) 显示文件信息
# 显示文件权限
tree -p
# 显示文件大小
tree -s
# 显示文件所有者
tree -u
# 显示文件所属组
tree -g
# 显示文件修改时间
tree -D
# 显示文件权限和大小
tree -p -s
# 显示文件权限、大小和修改时间
tree -p -s -D
# 显示文件权限、大小、修改时间和所有者
tree -p -s -D -u
# 显示文件权限、大小、修改时间、所有者和所属组
tree -p -s -D -u -g
5. 常用实例详解
(1) 基本显示示例
# 显示当前目录的树状结构
tree
# 输出:
# .
# ├── dir1
# │ ├── file1.txt
# │ └── file2.txt
# ├── dir2
# │ ├── subdir1
# │ │ └── file3.txt
# │ └── subdir2
# │ └── file4.txt
# └── file5.txt
#
# 3 directories, 5 files
# 显示指定目录的树状结构
tree /home/user
# 输出:显示/home/user目录的树状结构
# 显示多个目录的树状结构
tree dir1 dir2 dir3
# 输出:分别显示三个目录的树状结构
(2) 显示隐藏文件示例
# 显示所有文件和目录(包括隐藏文件)
tree -a
# 输出:
# .
# ├── .hidden
# ├── dir1
# │ ├── .hidden_file
# │ ├── file1.txt
# │ └── file2.txt
# ├── dir2
# │ ├── subdir1
# │ │ └── file3.txt
# │ └── subdir2
# │ └── file4.txt
# └── file5.txt
#
# 3 directories, 6 files
# 显示指定目录的所有文件和目录
tree -a /path/to/dir
# 输出:显示指定目录的所有文件和目录
# 显示多个目录的所有文件和目录
tree -a dir1 dir2 dir3
# 输出:分别显示三个目录的所有文件和目录
(3) 只显示目录示例
# 只显示目录
tree -d
# 输出:
# .
# ├── dir1
# ├── dir2
# │ ├── subdir1
# │ └── subdir2
# └── dir3
#
# 5 directories
# 只显示指定目录的目录结构
tree -d /path/to/dir
# 输出:显示指定目录的目录结构
# 只显示多个目录的目录结构
tree -d dir1 dir2 dir3
# 输出:分别显示三个目录的目录结构
(4) 显示完整路径示例
# 显示完整路径
tree -f
# 输出:
# .
# ├── ./dir1
# │ ├── ./dir1/file1.txt
# │ └── ./dir1/file2.txt
# ├── ./dir2
# │ ├── ./dir2/subdir1
# │ │ └── ./dir2/subdir1/file3.txt
# │ └── ./dir2/subdir2
# │ └── ./dir2/subdir2/file4.txt
# └── ./file5.txt
#
# 3 directories, 5 files
# 显示指定目录的完整路径
tree -f /path/to/dir
# 输出:显示指定目录的完整路径
# 显示多个目录的完整路径
tree -f dir1 dir2 dir3
# 输出:分别显示三个目录的完整路径
(5) 显示文件信息示例
# 显示文件权限
tree -p
# 输出:
# .
# ├── [drwxr-xr-x] dir1
# │ ├── [-rw-r--r--] file1.txt
# │ └── [-rw-r--r--] file2.txt
# ├── [drwxr-xr-x] dir2
# │ ├── [drwxr-xr-x] subdir1
# │ │ └── [-rw-r--r--] file3.txt
# │ └── [drwxr-xr-x] subdir2
# │ └── [-rw-r--r--] file4.txt
# └── [-rw-r--r--] file5.txt
#
# 3 directories, 5 files
# 显示文件大小
tree -s
# 输出:
# .
# ├── [ 4096] dir1
# │ ├── [ 1024] file1.txt
# │ └── [ 2048] file2.txt
# ├── [ 4096] dir2
# │ ├── [ 4096] subdir1
# │ │ └── [ 3072] file3.txt
# │ └── [ 4096] subdir2
# │ └── [ 4096] file4.txt
# └── [ 5120] file5.txt
#
# 3 directories, 5 files
# 显示文件所有者
tree -u
# 输出:
# .
# ├── [user ] dir1
# │ ├── [user ] file1.txt
# │ └── [user ] file2.txt
# ├── [user ] dir2
# │ ├── [user ] subdir1
# │ │ └── [user ] file3.txt
# │ └── [user ] subdir2
# │ └── [user ] file4.txt
# └── [user ] file5.txt
#
# 3 directories, 5 files
# 显示文件所属组
tree -g
# 输出:
# .
# ├── [user ] dir1
# │ ├── [user ] file1.txt
# │ └── [user ] file2.txt
# ├── [user ] dir2
# │ ├── [user ] subdir1
# │ │ └── [user ] file3.txt
# │ └── [user ] subdir2
# │ └── [user ] file4.txt
# └── [user ] file5.txt
#
# 3 directories, 5 files
# 显示文件修改时间
tree -D
# 输出:
# .
# ├── [Jan 01 12:00] dir1
# │ ├── [Jan 01 12:00] file1.txt
# │ └── [Jan 01 12:00] file2.txt
# ├── [Jan 01 12:00] dir2
# │ ├── [Jan 01 12:00] subdir1
# │ │ └── [Jan 01 12:00] file3.txt
# │ └── [Jan 01 12:00] subdir2
# │ └── [Jan 01 12:00] file4.txt
# └── [Jan 01 12:00] file5.txt
#
# 3 directories, 5 files
# 显示文件权限和大小
tree -p -s
# 输出:
# .
# ├── [drwxr-xr-x 4096] dir1
# │ ├── [-rw-r--r-- 1024] file1.txt
# │ └── [-rw-r--r-- 2048] file2.txt
# ├── [drwxr-xr-x 4096] dir2
# │ ├── [drwxr-xr-x 4096] subdir1
# │ │ └── [-rw-r--r-- 3072] file3.txt
# │ └── [drwxr-xr-x 4096] subdir2
# │ └── [-rw-r--r-- 4096] file4.txt
# └── [-rw-r--r-- 5120] file5.txt
#
# 3 directories, 5 files
# 显示文件权限、大小和修改时间
tree -p -s -D
# 输出:
# .
# ├── [drwxr-xr-x 4096 Jan 01 12:00] dir1
# │ ├── [-rw-r--r-- 1024 Jan 01 12:00] file1.txt
# │ └── [-rw-r--r-- 2048 Jan 01 12:00] file2.txt
# ├── [drwxr-xr-x 4096 Jan 01 12:00] dir2
# │ ├── [drwxr-xr-x 4096 Jan 01 12:00] subdir1
# │ │ └── [-rw-r--r-- 3072 Jan 01 12:00] file3.txt
# │ └── [drwxr-xr-x 4096 Jan 01 12:00] subdir2
# │ └── [-rw-r--r-- 4096 Jan 01 12:00] file4.txt
# └── [-rw-r--r-- 5120 Jan 01 12:00] file5.txt
#
# 3 directories, 5 files
# 显示文件权限、大小、修改时间和所有者
tree -p -s -D -u
# 输出:
# .
# ├── [drwxr-xr-x 4096 Jan 01 12:00 user ] dir1
# │ ├── [-rw-r--r-- 1024 Jan 01 12:00 user ] file1.txt
# │ └── [-rw-r--r-- 2048 Jan 01 12:00 user ] file2.txt
# ├── [drwxr-xr-x 4096 Jan 01 12:00 user ] dir2
# │ ├── [drwxr-xr-x 4096 Jan 01 12:00 user ] subdir1
# │ │ └── [-rw-r--r-- 3072 Jan 01 12:00 user ] file3.txt
# │ └── [drwxr-xr-x 4096 Jan 01 12:00 user ] subdir2
# │ └── [-rw-r--r-- 4096 Jan 01 12:00 user ] file4.txt
# └── [-rw-r--r-- 5120 Jan 01 12:00 user ] file5.txt
#
# 3 directories, 5 files
# 显示文件权限、大小、修改时间、所有者和所属组
tree -p -s -D -u -g
# 输出:
# .
# ├── [drwxr-xr-x 4096 Jan 01 12:00 user user ] dir1
# │ ├── [-rw-r--r-- 1024 Jan 01 12:00 user user ] file1.txt
# │ └── [-rw-r--r-- 2048 Jan 01 12:00 user user ] file2.txt
# ├── [drwxr-xr-x 4096 Jan 01 12:00 user user ] dir2
# │ ├── [drwxr-xr-x 4096 Jan 01 12:00 user user ] subdir1
# │ │ └── [-rw-r--r-- 3072 Jan 01 12:00 user user ] file3.txt
# │ └── [drwxr-xr-x 4096 Jan 01 12:00 user user ] subdir2
# │ └── [-rw-r--r-- 4096 Jan 01 12:00 user user ] file4.txt
# └── [-rw-r--r-- 5120 Jan 01 12:00 user user ] file5.txt
#
# 3 directories, 5 files
6. 高级功能
(1) 限制目录深度
# 限制目录深度为1
tree -L 1
# 限制目录深度为2
tree -L 2
# 限制目录深度为3
tree -L 3
# 限制目录深度为指定值
tree -L n
# 限制目录深度并显示文件信息
tree -L 2 -p -s -D
(2) 忽略指定文件
# 忽略指定模式的文件
tree -I "*.txt"
# 忽略多个模式的文件
tree -I "*.txt|*.log"
# 忽略隐藏文件
tree -I ".*"
# 忽略指定目录
tree -I "dir1"
# 忽略多个目录
tree -I "dir1|dir2"
# 忽略指定模式的文件并显示文件信息
tree -I "*.txt" -p -s -D
(3) 只显示匹配文件
# 只显示匹配指定模式的文件
tree -P "*.txt"
# 只显示匹配多个模式的文件
tree -P "*.txt|*.log"
# 只显示匹配指定模式的文件并显示文件信息
tree -P "*.txt" -p -s -D
# 只显示匹配指定模式的文件并限制目录深度
tree -P "*.txt" -L 2
(4) 文件后添加标识符
# 在文件后添加标识符
tree -F
# 在文件后添加标识符并显示文件信息
tree -F -p -s -D
# 在文件后添加标识符并限制目录深度
tree -F -L 2
# 在文件后添加标识符并忽略指定文件
tree -F -I "*.txt"
(5) 排序和颜色
# 按修改时间排序
tree -t
# 按修改时间倒序排序
tree -r
# 按修改时间排序并显示文件信息
tree -t -p -s -D
# 按修改时间倒序排序并显示文件信息
tree -r -p -s -D
# 显示颜色
tree -C
# 不显示颜色
tree -n
# 显示颜色并显示文件信息
tree -C -p -s -D
# 不显示颜色并显示文件信息
tree -n -p -s -D
(6) 输出到文件
# 将结果输出到文件
tree -o output.txt
# 将结果输出到文件并显示文件信息
tree -p -s -D -o output.txt
# 将结果输出到文件并限制目录深度
tree -L 2 -o output.txt
# 将结果输出到文件并忽略指定文件
tree -I "*.txt" -o output.txt
# 将结果输出到文件并只显示匹配文件
tree -P "*.txt" -o output.txt
(7) 特殊字符处理
# 用问号代替不可打印字符
tree -q
# 直接显示文件名,不处理控制字符
tree -N
# 用问号代替不可打印字符并显示文件信息
tree -q -p -s -D
# 直接显示文件名,不处理控制字符并显示文件信息
tree -N -p -s -D
7. 实际应用场景
场景一:项目目录结构展示
# 显示项目目录结构
tree project/
# 显示项目目录结构,包括隐藏文件
tree -a project/
# 显示项目目录结构,只显示目录
tree -d project/
# 显示项目目录结构,显示完整路径
tree -f project/
# 显示项目目录结构,显示文件权限、大小和修改时间
tree -p -s -D project/
# 显示项目目录结构,限制目录深度为2
tree -L 2 project/
# 显示项目目录结构,忽略日志文件
tree -I "*.log" project/
# 显示项目目录结构,只显示源代码文件
tree -P "*.py|*.js|*.java" project/
# 显示项目目录结构,按修改时间排序
tree -t project/
# 显示项目目录结构,按修改时间倒序排序
tree -r project/
# 显示项目目录结构,输出到文件
tree project/ -o project_structure.txt
场景二:系统目录结构分析
# 显示系统目录结构
tree /
# 显示系统目录结构,只显示目录
tree -d /
# 显示系统目录结构,限制目录深度为1
tree -L 1 /
# 显示系统目录结构,限制目录深度为2
tree -L 2 /
# 显示系统目录结构,显示文件权限、大小和修改时间
tree -p -s -D /
# 显示系统目录结构,忽略指定目录
tree -I "proc|sys|dev" /
# 显示系统目录结构,只显示配置文件
tree -P "*.conf|*.config" /
# 显示系统目录结构,按修改时间排序
tree -t /
# 显示系统目录结构,按修改时间倒序排序
tree -r /
# 显示系统目录结构,输出到文件
tree / -o system_structure.txt
场景三:用户目录结构管理
# 显示用户目录结构
tree ~/
# 显示用户目录结构,包括隐藏文件
tree -a ~/
# 显示用户目录结构,只显示目录
tree -d ~/
# 显示用户目录结构,显示完整路径
tree -f ~/
# 显示用户目录结构,显示文件权限、大小和修改时间
tree -p -s -D ~/
# 显示用户目录结构,限制目录深度为2
tree -L 2 ~/
# 显示用户目录结构,忽略缓存文件
tree -I "*.cache|*.tmp" ~/
# 显示用户目录结构,只显示文档文件
tree -P "*.txt|*.doc|*.pdf" ~/
# 显示用户目录结构,按修改时间排序
tree -t ~/
# 显示用户目录结构,按修改时间倒序排序
tree -r ~/
# 显示用户目录结构,输出到文件
tree ~/ -o user_structure.txt
场景四:脚本中的目录结构分析
#!/bin/bash
# 获取目录结构
DIR_STRUCTURE=$(tree -a -p -s -D)
# 获取目录结构,限制深度
DIR_STRUCTURE=$(tree -L 2 -a -p -s -D)
# 获取目录结构,忽略指定文件
DIR_STRUCTURE=$(tree -I "*.log|*.tmp" -a -p -s -D)
# 获取目录结构,只显示匹配文件
DIR_STRUCTURE=$(tree -P "*.py|*.js|*.java" -a -p -s -D)
# 获取目录结构,按修改时间排序
DIR_STRUCTURE=$(tree -t -a -p -s -D)
# 获取目录结构,按修改时间倒序排序
DIR_STRUCTURE=$(tree -r -a -p -s -D)
# 将目录结构输出到文件
tree -a -p -s -D -o structure.txt
# 将目录结构输出到文件,限制深度
tree -L 2 -a -p -s -D -o structure.txt
# 将目录结构输出到文件,忽略指定文件
tree -I "*.log|*.tmp" -a -p -s -D -o structure.txt
# 将目录结构输出到文件,只显示匹配文件
tree -P "*.py|*.js|*.java" -a -p -s -D -o structure.txt
# 将目录结构输出到文件,按修改时间排序
tree -t -a -p -s -D -o structure.txt
# 将目录结构输出到文件,按修改时间倒序排序
tree -r -a -p -s -D -o structure.txt
8. 与其他命令的区别
| 命令 | 特点 | 适用场景 |
|---|---|---|
tree | 以树状图形式列出目录内容 | 递归显示目录结构 |
ls | 列出目录内容 | 查看文件列表 |
ls -R | 递归列出目录内容 | 查看目录及其子目录内容 |
find | 查找文件和目录 | 根据条件查找文件 |
du | 显示文件或目录的磁盘使用情况 | 查看文件或目录的磁盘使用情况 |
df | 显示文件系统磁盘空间使用情况 | 查看文件系统磁盘空间使用情况 |
9. 注意事项
- 权限问题:普通用户只能查看有权限的目录
- 目录不存在:如果目录不存在,会报错”No such file or directory”
- 符号链接:默认不跟随符号链接,使用
-l选项可以跟随符号链接 - 目录深度:使用
-L选项可以限制目录深度,避免显示过多内容 - 文件过滤:使用
-I选项可以忽略指定文件,使用-P选项可以只显示匹配文件
10. 常见问题解决
(1) 权限不足
# 错误:权限不足
tree /root # 报错:Permission denied
# 正确:使用sudo
sudo tree /root
# 正确:查看有权限的目录
tree /home/user
# 正确:查看当前用户的主目录
tree ~/
# 正确:查看公共目录
tree /tmp
(2) 目录不存在
# 错误:目录不存在
tree nonexistent # 报错:No such file or directory
# 正确:检查目录是否存在
ls -l dirname
# 正确:使用存在的目录
tree existing_dir
# 正确:创建目录
mkdir dirname
tree dirname
# 正确:忽略不存在的目录错误
tree nonexistent 2>/dev/null
(3) 目录深度过大
# 错误:目录深度过大,显示内容过多
tree / # 可能显示过多内容
# 正确:限制目录深度
tree -L 2 /
# 正确:只显示目录
tree -d /
# 正确:忽略指定目录
tree -I "proc|sys|dev" /
# 正确:输出到文件
tree / -o structure.txt
# 正确:使用管道分页显示
tree | less
tree -L 2 | less
tree -d | less
(4) 符号链接问题
# 错误:符号链接指向不存在的目录
ln -s /nonexistent broken_link
tree broken_link # 报错:No such file or directory
# 正确:检查符号链接
ls -l linkname
# 正确:修复符号链接
ln -sf /path/to/target linkname
# 正确:使用物理路径
tree /path/to/target
# 正确:使用绝对路径
tree $(readlink linkname)
# 正确:跟随符号链接
tree -l linkname
(5) 选项错误
# 错误:选项错误
tree -x dirname # 报错:无效选项
# 正确:使用支持的选项
tree -a dirname
tree -d dirname
tree -f dirname
tree -p dirname
tree -s dirname
tree -D dirname
# 错误:缺少参数
tree -- # 报错:缺少参数
# 正确:使用正确的选项
tree --help
tree --version
# 错误:选项冲突
tree -a -d dirname # 可能报错
# 正确:使用不冲突的选项
tree -a dirname
tree -d dirname
核心要点总结:
tree是以树状图形式列出目录内容的命令,支持递归显示目录结构- 常用选项:
-a(显示所有文件)、-d(只显示目录)、-f(显示完整路径)、-p(显示文件权限)、-s(显示文件大小)、-D(显示文件修改时间)、-L(限制目录深度)、-I(忽略指定文件)、-P(只显示匹配文件) - 实际应用:项目目录结构展示、系统目录结构分析、用户目录结构管理、脚本中的目录结构分析
- 注意事项:普通用户只能查看有权限的目录,使用
-L选项可以限制目录深度,使用-I和-P选项可以过滤文件
tree命令是Linux系统目录管理的基础工具,熟练掌握可以直观地查看目录结构,提高工作效率。