简介:Linux Tree 1.7.0 的 tgz 安装包,面向需要在 CentOS 等 Linux 环境中以树形结构直观展示目录层级的运维、开发人员及命令行爱好者,解决递归列出目录时输出不够清晰、层次难以快速辨认的问题,适用于日常巡检、项目结构说明与教学演示等场景。压缩包内共 19 个文件,以 8 个 C 语言源文件为核心,辅以头文件、Makefile 构建脚本,以及 README、LICENSE、INSTALL、CHANGES、TODO 等说明、版权与版本记录文档,总大小仅 57KB。借助这些文件,读者既可以执行 make install 完成编译安装,快速上手 tree 命令;也可以研读源码,学习 C 语言项目组织、Makefile 编写和目录递归遍历的实现思路,适合想深入了解 Linux 命令内部原理的人群。包内同时提供英文与法文手册页,便于不同语言环境查看帮助;配套文档覆盖安装、变更、待办事项等多个维度,内容精炼而完整。已有 4484 人学习下载,是轻量实用、可直接落地的 Linux 工具资源。
1. 多数 Linux 新装系统都没有 tree 命令:这份 tgz 安装包和说明能直接补上
新装一台 Linux 服务器,或者刚拉起来一个容器,想看一眼项目目录结构,敲tree直接command not found。这在 Debian 系、RHEL 系发行版的最小化安装中非常常见,基础工具集默认不包含 tree 命令,多数新装系统都要手动补。
这份资源是一份linux tree tgz格式的安装压缩包,附带完整的安装与使用说明,解决的是没有可用包管理器、离线环境、或者不想为一个小工具污染系统包数据库时的安装问题。不用纠结源码细节,按说明一步步走就能装上。适合正在折腾服务器、写部署脚本、或者接手陌生项目目录的运维和开发。我已经用这类包在不少离线机器上补过这个命令,下面把安装路径、参数和踩过的坑一次说清。
2. 先搞清 tree 和 tgz:为什么需要单独安装,以及这个包格式的适用边界
2.1 tree 到底解决什么问题:和 ls、find 的分工差别
tree 的核心功能一句话能说清:递归地把目录结构画成一棵树。但实际动手之后会发现,它和 ls、find 三者的分工有明显差别,选错工具就差一截效率。
ls 默认只列当前目录一层,加-R会递归,但输出本质上是摊平的文件路径列表,层级一深就乱。find 的目标是检索,按名字、类型、大小、时间找文件,输出是匹配结果的路径列表,它回答的是“文件在哪里、有哪些”,不是“目录整体长什么样”。而 tree 正好补上这个空缺,输出带框线的层级树,层级关系靠竖线、横线明确画出来,一眼扫完整个目录的嵌套关系。
同样一个目录,两种命令摆在一起看更直观:
ls -R /srv/app # 平铺递归,看懂层级要靠数缩进 tree -L 2 /srv/app # 结构化树,嵌套关系直接画出来实际工作中我最常用的三个场景:一是接手不熟悉的项目,先tree -L 2看模块划分,比反复 cd 快太多;二是写部署文档、贴配置文件分布图的时候,直接用 tree 的输出,比手画示意图准确;三是排查服务器磁盘占用时,tree -h --du能直接暴露哪一层目录体积最大。
为什么很多发行版不预装它?tree 不是 POSIX 规范里的必备命令,属于独立的第三方小工具。最小化安装只保留核心工具链,tree 被放在额外软件包里,所以拿到干净机器没有 tree 是预期内的事,不是系统坏了。这正是这份资源存在的意义。
另外提个边界:tree 默认只输出目录和文件名,不显示文件内容。它不是编辑器也不是文件管理器,想看文件内部信息还是得靠 cat、less 和 vim,别指望它替代。
2.2 tgz 格式和包管理器安装的差异:什么时候用 tgz 更省事
tgz 的本质是 tar 归档再用 gzip 压缩,常见后缀就是 .tar.gz 或 .tgz。它和发行版自带的 rpm、deb 包最大的差异在于:tgz 不携带包管理元数据,不登记依赖关系,也不会写入系统的软件数据库。
| 对比维度 | 包管理器安装(rpm/deb) | tgz 源码包安装 |
|---|---|---|
| 依赖处理 | 自动解析并拉取 | 自行确认 gcc、make 等基础工具 |
| 安装位置 | 由包管理器规则决定 | configure 的 --prefix 决定 |
| 卸载 | 包管理器统一管理 | make uninstall 或手动删除文件 |
| 离线环境 | 需要预先配置本地源 | 拷到机器上就能解压编译 |
| 系统侵入 | 写入软件数据库 | 默认只写目标目录和 Makefile 产物 |
什么场景下 tgz 反而更省事?我碰到最多的是三类:内网离线服务器,手上没有可用的 yum 或 apt 源,但 tgz 拷进去就能本地编译;做容器镜像时,希望减少包管理器留下的状态信息,源码安装完清理掉编译中间文件,镜像体积更好控制;想装到非默认位置,比如 /opt 或用户目录,--prefix指定一下,系统自带的工具升级也不会覆盖它。
代价也同样明确:不支持自动依赖检查。假如机器上连 gcc 和 make 都没有,configure 阶段就会报错,这是源码安装的固有门槛,不是说明书能替你绕过的部分,动手前最好先确认工具链存在。
反过来说,如果机器的包管理器源里本来就有现成的 tree,而且能联网,那就没必要绕一圈走 tgz。tgz 的价值永远在“包管理器不可用、版本太旧、或者需要指定安装路径”这三类场景里。
2.3 拿到 tgz 包后先做三件事:预览包内容、读说明、确认版本
对任何 tgz 安装包,我养成的习惯是拿到手先预览内容,不直接解压。因为有些包没把文件放在独立目录里,直接解压会把源码散落在当前目录,搞得一团糟。
# 只查看包内文件清单,不实际解压 tar -tzf tree.tgz | head -20 # 确认了根目录是独立目录后,指定临时目录解压 mkdir -p /tmp/tree-install tar -xzf tree.tgz -C /tmp/tree-install/ cd /tmp/tree-install/tree-*/第一行的-t是 list 模式,-z按 gzip 解压读取清单,-f指向包文件,head -20只截取前面 20 行快速扫一眼。第二行我特意用-C指定解压目标目录,这样编译环境干净,中途出错想推倒重来,直接删掉临时目录就行,不会弄脏工作目录。
解压后先翻 README 或 INSTALL,不要跳过。tree 源码包里的说明一般会写出依赖的编译环境、可选编译开关、默认安装前缀。比如某些版本编译时加--with-bzip可以支持特殊压缩包的显示信息,这类开关不加,功能就编译不进去,等后面想用再回来补编译,成本更高。README 里如果提到需要--prefix指定路径,按第 3 章的方式写在 configure 命令里就行。
版本确认也在这个阶段做,解压出的目录名通常会带版本号,或者运行grep VERSION Makefile查看。不要猜,以包内实际情况为准。
3. 从 tgz 安装 tree 的完整路径:源码编译、二进制复用和用户目录三种走法
3.1 标准编译路径:configure、make、make install 一次走通
绝大多数 tree 源码包是 autoconf 风格工程,安装就是经典三步:
./configure --prefix=/usr/local make make install./configure做的事情是探测系统环境、检查编译器、看当前平台提供了哪些库和头文件,最后生成适配当前系统的 Makefile。--prefix=/usr/local指定安装前缀,最终可执行文件会进到 /usr/local/bin,显式写出来比完全靠默认值更明确,后面 make install 也不会装到预期之外的地方。
make这一步真正调用 gcc 编译源码,生成 tree 二进制。这一步不需要 root 权限,耗时通常在几十秒到一两分钟,取决于机器配置。make install把编译结果复制到 prefix 指定目录,因为要写 /usr/local/bin,普通用户会 permission denied,我一般加 sudo 执行。
三个命令对应三个阶段,顺序不能乱。configure 失败就要回去补依赖,make 失败一般是源码和系统平台不完全匹配,make install 失败基本就是权限问题。这三类报错的特征在第 5 章展开说。
编译前我先单独确认工具链:
which gcc which make两条命令都有输出说明工具链在。如果没有,Debian 系装 build-essential,RHEL 系装 Development Tools,装完回来重新 configure 就能过。这一步属于补环境依赖,跟 tree 包本身没关系。
如果 configure 过程中弹出其他错误,比如找不到某个头文件,多半是基础开发库没装齐,常见做法是先补系统开发工具组,再回来重新 configure,不要反复对着同一个错误较劲。
3.2 如果包里已经带可执行文件:跳过编译直接部署
有些 tgz 资源包不只有源码,还会预编译好可以直接运行的二进制。这种情形最省事,前提是二进制和当前系统架构匹配。我拿到文件先做检查:
ls -al tree file treefile tree的输出能看出来是 ELF 格式、对应什么架构、是否静态编译。x86_64 的二进制放不到 arm64 机器上跑,这是最常见的翻车点,提前查一下能省很多时间。
确认无误后执行安装:
chmod +x tree sudo cp tree /usr/local/bin/然后把说明文档一起保存,方便以后查参数:
sudo cp tree_usage.txt /usr/local/share/tree_usage.txtcp 之前加执行权限这一步经常被漏。直接从压缩包解压出来的文件可能没有 x 权限位,直接调用 /usr/local/bin/tree 会报 Permission denied,而不是 command not found,现象不一样,排查方向也就不同。
这种部署方式的另一面是:系统没有记录任何安装痕迹,将来卸载就是删掉 /usr/local/bin/tree 和帮助文档,目录结构自己心里有数就行。如果碰到包里同时有源码和二进制,我一般先看二进制能不能跑,能跑就不编译,编译只是为了兜底。
3.3 无 root 权限时:装到 ~/.local/bin 并配置 PATH
如果手上这台机器没有 root 权限,又不想反复麻烦管理员,装到用户目录是最实际的方式。tree 本身是单二进制工具,对运行库的依赖比较轻,非常适合这种方式。
mkdir -p ~/.local/bin cp tree ~/.local/bin/ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc把 PATH 追加到 ~/.bashrc 时注意不要重复追加,如果反复执行这段,PATH 里会积累多个重复项。我一般先grep tree ~/.bashrc检查一下再追加。用 zsh 的朋友把文件换成 ~/.zshrc。
PATH 里把用户目录放在最前面,是为了保证优先命中自己装的版本。如果系统里恰好有管理员装的旧版 tree,而新版有更强的过滤参数,PATH 顺序决定敲 tree 时命中的是哪个。
装完按老规矩验证:
which tree tree --version第一条确认路径,第二条确认二进制能正常跑。如果 which 没输出,十有八九是 echo 追加的那行没生效,可能是 shell 配置文件没 source,也可能是环境变量被后续配置覆盖了。
4. tree 参数实战:层级控制、过滤规则和磁盘占用排查
4.1 控制层级与显示范围:-L、-a、-d、--dirsfirst
tree 默认递归显示全部层级,这在大型项目里等于灾难,所以最常用的是限制深度:
tree -L 2只显示两层目录,第一层当前目录本身,第二层直接子项。写文档时-L 2基本够用,看大项目模块划分用-L 3左右。-L后面必须跟数字,数字缺失会直接报错。
隐藏文件默认不显示,想看完整结构加-a:
tree -a -L 2这个参数在检查项目里是否存在遗漏的 .gitignore、.env 文件时特别有用。-a同时把 . 和 .. 排除掉了,不用手动过滤。
只看目录不看文件:
tree -d -L 2 --dirsfirst-d让输出只保留目录节点,文件全部隐藏,配合-L就是一张干净的目录骨架图,我排查目录结构时常用。--dirsfirst让目录排在文件前面,默认是文件在前,这个开关打出来视觉上更接近常见 IDE 的项目树。
这些参数可以自由组合,注意-d和-a同时用时,隐藏目录名的前导点仍然会显示,过滤规则不会因为-d而改变。
4.2 过滤与排除:-I 忽略、-P 包含、--prune 剪空枝
排除干扰目录是最实用的能力。看 node 项目不想看到 node_modules,看 git 仓库不想看到 .git:
tree -L 2 -I 'node_modules|.git'-I后面跟一个模式串,多个排除项用竖线分隔。这个模式用的是 shell 风格通配符,不是完整正则,*、?、[...]都支持。我一般加引号防止 shell 展开,写成'node_modules|.git'而不是裸写。
提示:
-I的参数是通配符风格,不是正则,写复杂规则时先在小目录里试跑一份,确认匹配范围再拿到大目录上用。
只看特定类型文件,用-P:
tree -P '*.py'-P只显示匹配到的文件,但目录也会显示,为的是保留路径上下文。如果只想要纯文件列表,再配合排除或者直接 find 更干净。
排除之后空目录还留在视图里,看着碍事可以剪掉:
tree -L 3 -I 'node_modules|.git' --prune--prune会把过滤后变成空的目录直接从输出里去掉。这个开关很实用,但有个细节:如果顶层目录本身被-I匹配掉了,整个子树都会被剪掉,不会有空目录残留。
4.3 输出带大小和日期:-h、--du、-t、-r
排查磁盘占用的需求,tree 也能处理,不一定非得用 du 死磕。
tree -h --du-h给每个文件显示人类可读大小(KB/MB),--du让每个目录节点累计显示子项总大小。这相当于给目录树挂了个动态的磁盘占用统计,一眼能看出哪个目录最肥,是日志还是缓存。
注意--du计算时会真正遍历并统计每个文件,大目录下会比较慢。如果只想知道总占用,用du -sh *可能更快,tree 更适合“结构加大小”一起看的场景。
排序和反转也常用,按修改时间排列可以快速定位最近改动的目录:
tree -t -r-t按修改时间排序,-r反转排序结果为最新的排最上。跟-L 2配合,能快速看出来最近两天动了哪些目录,排查部署问题时这个组合我经常用。
常用参数汇总成速查表:
| 参数 | 作用 | 注意 |
|---|---|---|
| -L n | 限制显示层级 | n 为 0 时只显示当前目录 |
| -a | 显示隐藏文件 | 同时忽略 . 和 .. |
| -d | 只显示目录 | 不显示任何文件 |
| -I 'a|b' | 排除匹配项 | 通配符风格,非正则 |
| -P '*.py' | 只显示匹配项 | 目录会保留 |
| --prune | 剪掉过滤后的空目录 | 推荐配合 -I 使用 |
| -h | 显示人类可读大小 | 单文件大小 |
| --du | 目录累计大小 | 遍历成本高 |
| -t | 按修改时间排序 | 结合 -r 使用 |
| -r | 反转排序结果 | 让最新排最前 |
5. 安装和使用中的避坑记录:编译环境、路径、乱码和输出失控
5.1 编译环节:configure 报错基本都是缺工具链
- 现象:执行
./configure时出现类似configure: error: no acceptable C compiler found in $PATH,或者 make 阶段报make: gcc: No such file or directory。 - 原因:机器上的基础环境没装完整编译工具链,最小化安装默认不含 gcc 和 make,这不是 tree 包本身的问题。
- 解决:先
which gcc && which make确认缺失项,然后按系统类别补装开发工具组,装完回来重新./configure,不需要重新解压源码包。
这个坑是源码安装里出现频率最高的一个,它跟 tree 无关,属于环境依赖问题。我现在的排查顺序固定为:先确认编译器,再确认源码解压完整,最后看 configure 具体报错在哪一行,不要一上来就怀疑包有问题。
另一种常见情况是 configure 通过了、make 到一半中断,报错指向某个源码文件。这种我一般先看是不是磁盘满了,df -h扫一眼;如果磁盘没问题,再考虑源码包是不是解压时损坏,重新解压一份对比就能定位。编译阶段的问题九成出在这两类。
5.2 安装与调用环节:装好了却 command not found
- 现象:make install 没有任何报错,但换一个终端敲
tree仍然提示command not found。 - 原因:两种常见情况。一是安装前缀里的目录不在当前 shell 的 PATH 里;二是直接拷贝二进制时,目标目录本身不在 PATH 里,比如 /usr/local/sbin 和 /usr/local/bin 在某些精简系统里并不等价。
- 解决:执行
which tree看是否命中,没命中就用find /usr/local /opt /home -name tree -type f找到实际安装位置,然后把所在目录追加到 shell 配置文件。加到配置里而不是临时 export,避免重启会话后失效。
这属于每次换机器都要记一遍的典型路径坑。排查顺序固定为:which 找不到 → 用 find 找文件 → 看 PATH 包含哪些目录 → 修正配置文件并 source。
还有一个容易忽略的细节:如果装到了用户目录,但当前 shell 是 su 切换过来的,PATH 可能被重置过,需要确认当前环境变量到底加载了哪个配置文件,别在这一步浪费太多时间。常见做法是直接在目标用户下重新登录一次再验证。
5.3 展示环节:中文乱码、大目录卡顿与输出失控
现象一:项目里有中文文件名时,tree 输出的树形边框线变成问号或乱码。
原因:终端字符集问题和 locale 配置共同导致,树形字符用到了 Unicode 框线字符,当前 locale 不是 UTF-8,或者终端字体不支持。
解决:运行
export LANG=C.UTF-8或者直接给 tree 加--charset utf-8,让输出强制走 UTF-8 编码。现象二:在根目录或 /var 下直接跑
tree,输出几万行,终端卡到没响应。原因:tree 默认不限制深度和数量,在系统目录上等于无过滤的递归全量输出。
解决:无脑加
-L 2起步,配合-I 'proc|sys|dev'排除虚拟目录;如果看的是日志目录,再配合--prune剪掉空分支。现象三:想输出到文件里给同事看,结果
tree > tree.txt只保存了目录名,没有树形线也没有颜色。原因:输出重定向后 tree 检测到不是终端,自动取消了装饰字符,这是它内部 isatty 检测的特性。
解决:显式加
--charset utf-8和-C参数强制造型,具体写在第 6 章。
这三条属于“看起来能用、实际踩了才知道”的类型。第一条是 locale 配置问题,第二条是使用习惯问题,第三条是输出检测机制问题,都不需要重新编译,直接调参数就能解决。
6. 让输出更好用的进阶技巧:颜色、文件导出与 alias 固化
6.1 颜色与字符集:让输出在终端和文件里都正常
tree 支持颜色区分文件类型,但很多终端默认不带彩色。加-C参数强制输出颜色,目录、可执行文件、普通文件会有不同显示,一眼扫过去比纯文本清爽得多。
为了不用每次手动敲参数,我在 shell 配置里固化了一行 alias:
alias tree='tree -C --dirsfirst --charset utf-8'-C强制颜色,--dirsfirst目录优先显示,--charset utf-8避免中文环境下的框线乱码。这样无论何时敲 tree 都带上这些参数。后续命令行追加的-L、-I会跟在 alias 展开内容后面,互不冲突。
6.2 导出文件与定向检索:配合 grep、tee 快速产出
输出到文件给同事或贴 issue 时,直接重定向会把颜色和装饰字符弄丢。我一般这样处理:
tree -L 3 -C --charset utf-8 | tee tree_snapshot.txttee同时输出到终端和文件,文件里保留颜色转义序列,贴到支持 ANSI 的终端里能看到彩色树。如果只是给纯文本环境用,去掉-C保留--charset utf-8就够。
配合 grep 做定向检索也能省不少事:
tree -L 3 -a | grep -E '\.(conf|yaml)$'把 tree 的结构输出喂给 grep,相当于带层级语义的过滤,比 find 后逐个看上下文更直觉。
6.3 换机器不再重新编译:单文件分发的验证顺序
tree 是依赖很轻的单文件工具,大多数发行版之间可以直接复用编译好的二进制。后来我换机器时不再重新走编译流程,而是直接确认架构、拷文件、验证版本:
file /usr/local/bin/tree tree --version tree -L 1第一条确认架构匹配,第二条确认版本可用,第三条跑通一个最小输出,三步走完整个部署就结束了。
有一次我在内网机器上折腾了半个多小时,给同事的离线环境装 tree,搞到一半才发现新机器是 arm64 架构,带过去的是 x86 版本。从那以后我每次做这种单文件工具分发,都会先跑file tree确认架构,再打包传走,希望帮到你。
本文还有配套的精品资源,点击获取