简介:面向 Linux 系统管理者和开发者的一份 tree 命令完整安装资源,解决 CentOS 等发行版默认未预装 tree 时无法以树形方式浏览目录的问题。tree 作为经典递归目录列表工具,能按层级深度缩进展示文件与子目录,显著提升文档整理、项目结构梳理和大目录巡检效率。安装包采用 tgz 压缩格式,共 19 个文件、总体积仅 57KB,内含 8 个 C 源文件、Makefile 构建脚本,以及 README、INSTALL、CHANGES、帮助手册等文档,结构清晰,便于快速定位。源码按功能拆分,涵盖目录树生成、跨平台兼容、JSON/XML 输出等实现路径,可帮助读者理解命令行工具的参数解析、输出格式控制和小型项目组织方式。目前已有 4484 人学习下载,适合命令行初学者快速上手;包内附简明安装说明,解压后执行相应命令即可完成部署,也适合离线环境复用。
1. 先搞清楚:tree 不是系统自带的命令
很多人在 Linux 服务器上敲tree想看目录结构,结果等来一句-bash: tree: command not found。这不是你环境有问题,而是 tree 本身就不是所有发行版默认安装的软件包。我在某公司负责内部运维时,每次拿到新装好的系统,第一件事就是补上 tree,因为排查目录层级、梳理日志目录、给新人讲项目结构,它比ls -R直观太多了。
这篇文章要讲的,就是 tree 命令从安装到使用的一条龙内容:不同发行版下怎么装、核心参数怎么用、输出怎么定制,以及我在实际环境里踩过的几个坑。你会发现这东西很简单,但参数组合用好了,能省下不少用 find 和 grep 拼命令的时间。适合刚接触 Linux 的初学者,也适合想把手头命令用得更精细的熟手。
2. 安装前先判断:你的系统到底缺不缺 tree
2.1 先看系统发行版,再决定装法
tree 的安装方式完全取决于你的包管理器。常见的几个大类我先列一下,你在自己机器上对号入座:
| 发行版家族 | 包管理器 | 典型系统 | 安装命令 |
|---|---|---|---|
| Red Hat 系 | dnf / yum | RHEL、CentOS、Fedora | dnf install tree |
| Debian 系 | apt | Ubuntu、Debian、Linux Mint | apt install tree |
| SUSE 系 | zypper | openSUSE、SLES | zypper install tree |
| Arch 系 | pacman | Arch Linux、Manjaro | pacman install tree |
| 容器/无包管理器 | 编译源码 | Alpine、最小化镜像 | 见下文编译安装 |
判断方法很简单,执行cat /etc/os-release看ID那一行,或者直接which dnf yum apt zypper pacman看哪个存在。我不太建议用一条apt-get命令通吃所有系统,因为如果这台机器实际是 CentOS,你敲 apt 只会得到一串找不到命令的报错。判断这一步花不了十秒,能省掉后续的安装失败排查时间。
2.2 确认安装前的三个前置条件
安装 tree 之前,我一般会顺手确认三件事,避免装到一半卡住:
第一是网络源是否可用。运行yum list tree或apt-cache policy tree,如果能看到版本信息,说明源没问题。看不到的话,大概率是软件源没配好,先修源再装。
第二是是否有 root 权限。tree 的安装包需要写入系统目录,普通用户执行会提示权限不足。我一般用sudo,有些公司环境里普通用户没有 sudo 权限,那就得找管理员申请。
第三是是否需要特定版本。大多数场景下仓库里的版本够用了,但如果你需要在脚本里调用 tree 的某个新参数(比如--dirsfirst排序功能在某些老版本里行为不一致),就得考虑编译安装新版本。后面第 3 章的源码编译就是为这个准备的。
3. 安装 tree 的两种主流方式:包管理器与源码编译
3.1 最省事的方式:用包管理器直接装
以 Red Hat 系为例,完整安装步骤就两三条命令:
# 先确认源里有没有 tree 这个包 yum list tree # 安装,-y 表示跳过确认提示 sudo yum install -y tree # 验证安装结果,能输出版本号就说明成功了 tree --versionDebian 系的朋友把yum换成apt就行,命令逻辑完全一致。-y参数会自动回答安装过程中的 "Is this ok?" 确认提示,但在生产环境我建议去掉它,多看一眼要安装的依赖清单,避免装进不想要的额外包。验证这一步很多人跳过,其实值得做一下,因为有些环境里 tree 虽然装了,但 PATH 没包含/usr/local/bin,直接敲 tree 依然会报 not found。
3.2 需要新版本或最小系统时:源码编译安装
包管理器装的是发行版打包好的版本,通常比较旧。如果你需要用新特性,或者你的系统是最小化安装(连 make 都没有),就得上源码编译。整个过程分四步:
# 1. 下载源码包并解压(版本号以实际下载到的为准) wget https://example.com/tree-2.1.1.tgz tar zxf tree-2.1.1.tgz cd tree-2.1.1 # 2. 编译,PREFIX 指定安装路径,默认是 /usr make # 3. 安装到系统目录,需要 root 权限 sudo make install # 4. 确认安装位置和版本 which tree && tree --version源码编译的时候有几个参数值得说。make PREFIX=/usr可以指定安装前缀,我习惯装在/usr/local而不是/usr,这样以后卸载只需要删掉/usr/local/bin/tree和对应的 man 文档,不会污染系统自带的目录结构。如果你在编译过程中遇到缺少 gcc 或 make 的报错,先安装开发工具组:yum groupinstall "Development Tools"。这一步是新手最常卡住的地方——不是 tree 本身的问题,而是编译环境不完整。
3.3 安装完成后需要做的验证清单
装完后我建议按下面的清单过一遍,确认整个链路是通的:
| 检查项 | 命令 | 正常结果 |
|---|---|---|
| 命令能找到 | which tree | 输出路径,如 /usr/bin/tree |
| 版本正常 | tree --version | 输出 v2.x.x 等版本号 |
| 帮助可读 | tree -h | 输出参数说明 |
| 基本功能 | tree /etc | 能列出 /etc 的目录树 |
| 中文不乱码 | tree一个含中文目录名的路径 | 文件名正常显示 |
最后一条在我这儿出现过问题,后面避坑章节会专门展开。这里先记住一个原则:装完跑一个真实目录做冒烟测试,别只在空目录里验证,不然中文字符和符号链接这些特殊场景的问题不会暴露出来。
4. 核心参数与输出控制:把目录树调整成你要的样子
4.1 最常用的五个参数及其组合逻辑
tree 的参数很多,但日常用到的核心就这几个:
| 参数 | 作用 | 示例 |
|---|---|---|
-L 深度 | 限制显示层级 | tree -L 2只看两层 |
-d | 只显示目录,不显示文件 | tree -d |
-a | 显示隐藏文件 | tree -a(默认不显示 . 开头文件) |
-P 模式 | 只匹配特定模式的文件 | tree -P "*.log" |
--dirsfirst | 目录排在文件前面 | tree --dirsfirst |
组合起来效果很不一样。我排查日志目录的时候,常用tree -L 2 -d /var/log只看两层目录结构,避免被大量日志文件刷屏。而给新人介绍项目时,用tree -L 3 --dirsfirst -a能同时展示隐藏配置文件和目录优先顺序,结构一目了然。
# 实战组合:只看两层目录,并且显示隐藏文件 tree -L 2 -d -a /home/某开发者/project # 实战组合:只看某种类型的文件分布 tree -P "*.py" /home/某开发者/project参数顺序不影响结果,tree 会统一解析。但我会习惯把路径放最后,这样命令前面是参数、后面是目标,视觉上更清晰。注意-P用的是通配符模式而不是正则表达式,想匹配多个后缀需要用-P "*.py|*.js"这样的写法,管道符号在单引号或双引号内不需要转义,在双引号外反而会出事。
4.2 控制输出的细节:颜色、编码与字符集
tree 默认对目录、可执行文件、符号链接输出不同的颜色,这在终端里没有问题,但如果你要把结果重定向到文件里保存或者发给别人,颜色会让文件里出现一坨 ANSI 转义码。这时候用-n参数关掉颜色:
# 无颜色输出,适合重定向到文件 tree -n > structure.txt # 配合 -L 和 -d 生成干净的目录结构清单 tree -L 3 -d -n > dir_structure.txt字符集问题是另一个坑点。tree 在输出中文目录名时,如果系统 locale 设置不对,会显示成\344\275\240\345\245\275这样的八进制转义序列。解决办法是终端里执行export LC_ALL=en_US.UTF-8或者在调用 tree 时指定--charset utf-8。我在某跨平台系统项目里遇到过这问题,写进脚本时还容易漏掉,最后干脆在脚本开头统一加一行export LC_ALL=C.UTF-8双保险。
4.3 输出到文件与脚本中的标准用法
在脚本里用 tree,我推荐固定用-n、-f、-L三个参数组合。-f会输出完整路径而不是相对路径,这样生成的文件清单可以直接被其他脚本读取:
# 生成带完整路径的目录树,供脚本读取 tree -n -f -L 3 /data/project > /tmp/project_tree.txt # 排除某些目录,比如 .git 和 node_modules tree -n -f -I ".git|node_modules" /data/project-I参数是排除模式的写法,和-P一样支持管道符分隔多个模式。这两个参数我建议成对理解:一个是"只要这些",一个是"不要这些"。实际使用中-I我用得更多,因为源码项目里 node_modules、.git、dist 这类目录占空间又没意义,默认不排除会让整棵树的输出漂移得很长。
5. 避坑指南:tree 安装与使用中最常见的 5 个问题
5.1 敲了 tree 还是提示 command not found
现象:明明执行过安装命令,重新打开终端后依然报command not found。原因有两类:安装时用的是普通用户身份没装进去;或者装到了/usr/local/bin,但这个路径不在当前用户的 PATH 环境变量里。解决方法是先which tree看路径,如果在/usr/local/bin,把export PATH=/usr/local/bin:$PATH写进用户的.bashrc,然后source ~/.bashrc。如果 which 完全没有输出,说明压根没装上,重新按上面的安装命令走一遍,注意看输出里有没有Permission denied字样。
5.2 中文文件名显示成八进制转义序列
现象:目录树里所有中文名变成\345\233\276\347\211\207这样的格式,完全不可读。原因:tree 的默认字符集检测失败,回退到了 ASCII 转义。解决:执行tree --charset utf-8或者在.bashrc里加alias tree='tree --charset utf-8'。如果这样还不行,检查系统 locale,echo $LANG看是否为 UTF-8,不是的话设置export LANG=en_US.UTF-8后重试。这个问题在 CentOS 7 和部分旧版 Ubuntu 上比较常见,某开发者曾因为在容器里看中文项目名变成乱码,排查了半天才发现是容器基础镜像的 locale 根本没配置。
5.3 输出到文件后内容乱码
现象:把 tree 输出重定向到文件,用编辑器打开全是乱码。原因:终端下显示正常是因为终端做了字符集转换,但重定向时 tree 仍可能按非 UTF-8 字符集输出,且带颜色转义码。解决:用tree -n --charset utf-8 > file.txt,-n去掉颜色转义码,--charset强制字符集。这一步我在生成项目文档时必加,否则同事用 Windows 打开 txt 文件全是 ANSI 转义符。
5.4 排除目录时不生效
现象:加了-I ".git"但 .git 目录还是显示在树里。原因:-I的匹配是通配符模式,不是子串匹配,.git在部分版本里需要写成.*git*或".git*"才能正确覆盖。解决:用-I "*.git*"或-I ".git"加引号试一遍,也可以用-P做反向验证。我在某实验室的环境里遇到过只要 .git 目录没匹配上的情况,加上通配符后正常。另一个隐蔽点:排除多个目录时管道符在双引号里没问题,但如果你在 zsh 里忘了加引号,管道符会被 shell 解释成管道。
5.5 目录树太深刷屏
现象:在大型项目根目录执行 tree,输出几万行,终端直接卡死。原因:没有限制深度,tree 默认递归到全部子目录。解决:养成加-L的习惯,先-L 1看一层,再根据需求加深。另外一个缓解技巧是配合-d只看目录不看文件,行数能降一个量级。我看习惯了之后,除非明确要文件清单,否则默认都是tree -d -L 2。
6. 进阶技巧:把 tree 和 find 结合起来用,效率翻倍
tree 本身只负责展示目录结构,但遇到需要统计文件数量、按时间排序或者找特定文件时,配合 find 就是一套完整的目录分析流程。我常用的一个技巧是先用 tree 看结构、再用 find 做精准筛选:
# 1. 先看整体结构 tree -d -L 2 /data/project # 2. 再找特定类型文件的具体分布 find /data/project -name "*.log" -type f | head -50另一个实用技巧是通过 shell alias 固化高频参数组合,不用每次重复敲一长串。我自己的.bashrc里加了这么一行:
alias tree2='tree -L 2 --dirsfirst' alias treed='tree -d -L 3'这样的话,日常看项目结构用tree2,找目录层级用treed,既保持短命令又带着默认参数。如果你需要分享目录树给别人,用tree -L 3 -n -o structure.txt把输出直接写进文件,比在终端里截图后手动整理干净得多。-o参数会在执行命令的同时把内容写入文件,相当于>的替代品,好处是不用担心 shell 的管道优先级问题。
养成先确认版本、再选参数的习惯。我最近在某个新项目里用的发行版自带的是 tree 2.1.0,同事的机器上是 1.8.0,同样一条-I排除命令,在两台机器上的行为不一致——老版本对模式结尾的斜杠处理有差异。我的建议是工作环境里的 tree 尽量统一版本,团队共用一套 alias 配置,能省掉很多肉眼比对输出的时间。这套东西并不复杂,花十分钟装好、调顺手,以后每次看目录结构都能省一分钟,积累下来相当可观。希望帮到你。
本文还有配套的精品资源,点击获取