ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux tree 命令:离线 tgz 源码包安装与实用指南

Linux tree 命令:离线 tgz 源码包安装与实用指南 简介面向Linux系统管理员与开发者的tree命令离线安装包内含tree-1.7.0完整源码及安装说明解决CentOS等环境默认无tree命令、无法以树形结构快速查看目录层级的问题。整个tgz压缩包仅57KB共19个文件主体为C语言源码同时包含Makefile构建脚本、README/INSTALL说明文档、LICENSE许可证及CHANGES更新记录便于查看编译配置、功能变更与授权信息也适合有二次开发需求的用户整体结构紧凑适合个人服务器或离线环境备用。源码模块覆盖目录遍历、颜色显示及XML/JSON格式输出等扩展能力结构简洁、可读性好附带的安装说明对部署流程有清晰指引能帮助新用户快速完成启用。目前已有4483人学习/下载适合需要离线部署tree命令、研究其实现原理或希望定制输出格式的Linux使用者资源为1.7.0正式版本自带完整构建体系也可便捷移植到其他Unix-like环境。1. tree 命令把杂乱目录变成一眼可读的树接手一台陌生 Linux 服务器第一件事不是看配置而是先盘清楚目录结构。ls -R 输出几百行路径看得眼花find 打印出来的又是平铺列表根本看不出层级关系。tree 命令解决的就是这个问题一条命令把整个目录画成一棵清晰的树目录之间谁套谁、谁大谁小、哪些是文件哪些是目录一眼到底。这份资源里带的是 tree 的 tgz 源码包和配套安装说明不需要联网配源把包传上去解压编译就能用适合内网服务器、嵌入式环境、以及所有被 apt/yum 源折腾过的人。无论你是刚入行的运维还是天天跟 Linux 打交道的开发只要还在用终端tree 就是那种装上之后再也回不去的工具。2. 为什么用 tree从平铺输出到层级可视2.1 一个命令解决目录可视化的核心痛点Linux 原生的 ls 和 find 不是不能看目录而是输出形式不适合人脑理解层级关系。ls -R 会把每个子目录的路径前缀重复打印一遍目录一深满屏都是重复的路径字符串肉眼很难在一堆重复前缀里定位某个具体文件。find 默认是平铺输出每个文件一行目录的嵌套关系完全丢失你只看到一堆零散路径看不出哪个目录包含了哪个文件。tree 的处理方式完全不同它把目录结构渲染成真正的树状图用 ASCII 或 UTF-8 线条把父子关系画出来。根目录在顶部子目录和文件逐级缩进文件和子目录混合排列一眼就能看出某个目录下有几个子目录、哪些文件直接挂在当前层。这种输出格式对排查目录结构异常、确认文件是否放对了位置、向同事展示工程组织方式都直观得多。在实际运维场景里tree 的高频用法不是看整个根目录而是定位特定层级的结构。比如排查一个 tomcat 部署目录用 tree -L 2 看看 webapps 下有哪些应用或者确认一个数据仓库目录下的分层是否规范用 tree -d 只看目录不看文件输出干净利落。2.2 tgz 安装包为什么不用 apt/yum 而选源码编译大多数发行版用包管理器装 tree 只需要一条命令但现实环境往往没这么理想。内网服务器不能连外网源apt-get install 直接超时嵌入式环境的交叉编译工具链和主机架构不一致官方源里根本没有对应架构的预编译包还有一些最小化安装的 CentOS 系统连 yum 源都没配好用包管理器装东西要先把源折腾明白。tgz 源码包的好处在于不依赖任何发行版仓库一个 tar.gz 文件就能搞定。编译 tree 只需要 gcc 和 make这两个工具是 Linux 开发环境的标配几乎不会缺。源码包体积很小整个项目加起来也就几百 KB传文件、解压、编译、安装五分钟之内完成。对于需要批量在多台服务器上安装的场景把 tgz 包拷到内网共享目录每台机器解压编译思路一模一样不涉及版本不一致的问题。2.3 高频参数选型哪些参数最值得记tree 的参数总共有几十个实际工作中用得上的就那么几个。下面这张表列出的参数是我在服务器上用得最频繁的每个参数都对应一个具体场景。参数作用适用场景-L n限制显示深度为 n 层目录嵌套很深时只看前两层避免输出爆炸-d只显示目录不显示文件快速梳理目录骨架忽略文件细节-a显示隐藏文件以 . 开头的文件排查 .git、.env 等隐藏配置时用-C输出着色区分目录和文件终端里看彩色输出层级更清楚-h显示文件大小可读格式如 K/M/G找出占空间大的文件-f显示完整路径前缀需要把某个文件的完整路径复制到别处时用--dirsfirst目录排在文件前面让目录结构先出现文件后出现结构更清晰-I pattern忽略匹配模式的文件/目录排除 node_modules、.git 这类噪声目录记忆这些参数不用死记按场景对照想只看目录不看文件用 -d想限制深度用 -L想看隐藏文件用 -a想排除噪声目录用 -I。这几个参数组合起来基本能覆盖日常 90% 的需求。3. tgz 源码包安装从解压到 make install 的完整流程3.1 下载与解压先确认包完整再做任何操作拿到 tree 的 tgz 安装包后第一步是检查文件的完整性和解压。下载过程中文件可能损坏直接解压会在编译阶段报各种莫名其妙的错误浪费时间还不容易定位。# 检查文件类型确认确实是 gzip 压缩的 tar 包 file tree-2.0.2.tgz # 查看压缩包内的文件列表确认目录结构完整 tar -tzf tree-2.0.2.tgz # 解压到当前目录 tar -xzf tree-2.0.2.tgz # 进入解压后的目录 cd tree-2.0.2第一步file命令确认文件不是空文件或者 HTML 错误页从某些镜像站下载常见第二步tar -tzf列出包内内容重点看是否有 README、Makefile 这两个关键文件。如果列出内容里只有一堆源码文件但找不到 Makefile这个包可能不是标准的源码发布包后面编译流程会走不通。第三步解压和第四步进入目录顺序不能反。3.2 编译前的环境确认gcc 和 make 缺一不可tree 是 C 语言写的编译依赖 gcc 和 make。绝大多数 Linux 服务器这两个工具是预装好的但最小化安装的 CentOS、精简版 Ubuntu、或者某些嵌入式环境可能没有。编译前先确认环境省得到时候报错才回头查。# 检查 gcc 是否可用 gcc --version # 检查 make 是否可用 make --version # 如果提示 command not found用发行版对应方式安装 # Debian/Ubuntu 系 sudo apt-get install -y build-essential # CentOS/RHEL 系 sudo yum install -y gcc makegcc --version输出版本信息说明编译器可用make --version同理。如果提示 command not found不要继续往下走先装编译工具链。Debian 系直接装 build-essential 这个元包它会把 gcc、make、libc 开发头文件一次装齐CentOS 系用 yum 分别装 gcc 和 make 就行。3.3 编译与安装make 和 make install 的执行细节tree 的源码包结构非常简单没有 configure 脚本直接 make 就行。这是 tree 区别于其他 GNU 项目的特色少了一步配置环节安装流程大大简化。# 在 tree 源码目录下执行编译 make # 编译完成后把 tree 二进制安装到系统目录 sudo make install # 验证安装结果 tree --versionmake命令不带任何参数时会读取 Makefile 里的默认目标把源码编译成 tree 二进制文件。编译过程一般几秒到十几秒如果看到一堆 cc 命令和 gcc 的警告信息属于正常现象只要没有报 error 就行。sudo make install做的事情是把编译好的 tree 文件复制到 /usr/local/bin/ 目录下并设置好权限。最后一步tree --version是验证安装是否成功的关键如果能打印出版本号说明命令行能找到这个二进制文件安装流程到此结束。提示如果make install时报 Permission denied说明当前用户对 /usr/local/bin 没有写权限务必加上 sudo 执行。3.4 安装路径定制不装到 /usr/local/bin 也能用有些环境对系统目录有严格管控不允许往 /usr/local/bin 写文件或者你想把 tree 装到某个特定目录下方便统一管理。tree 的 Makefile 支持通过 PREFIX 变量指定安装路径。# 指到用户目录下不需要 root 权限 make PREFIX$HOME/.local install # 指到自定义的软件目录 make PREFIX/opt/software install # 手动执行安装路径确认 ls -l $HOME/.local/bin/tree # 确认 tree 能跑起来 $HOME/.local/bin/tree --versionPREFIX的意思是安装根目录默认值是 /usr所以默认安装路径是 /usr/local/bin。改成语你的路径后tree 会被装到 $HOME/.local/bin 或 /opt/software/bin 下面。注意指定 PREFIX 后shell 可能仍然找不到 tree 命令需要把对应目录加入 PATH 环境变量或者直接用完整路径调用。这个方法同样适用于交叉编译环境把 PREFIX 指到交叉工具链的 sysroot 目录可以很方便地把 tree 打包进根文件系统镜像。3.5 卸载与重装装错了怎么后悔tree 这种源码包安装的软件卸载起来比包管理器麻烦一点因为它不记录文件清单。不过 tree 的安装文件很少主要就是一个二进制文件卸载思路很直接。# 查看 tree 安装到了哪个路径 which tree # 删除二进制文件默认路径是 /usr/local/bin/tree sudo rm -f /usr/local/bin/tree # 如果用了 PREFIX 安装手动删除对应目录下的文件 rm -f $HOME/.local/bin/tree # 重新编译安装前先清理旧的对象文件 make clean makewhich tree找到二进制文件的实际路径然后删除。tree 不安装额外的库文件、配置文件或 man 页所以删掉二进制文件就是干净卸载。make clean用于清理上次编译产生的 .o 文件和 tree 二进制避免旧编译产物干扰新一次的编译。源码包管理的整体思路是编译产物都在当前目录不需要的随时 make clean重新来过成本很低。3.6 版本选择与兼容性tgz 包不是越新越好tree 的版本更新不算频繁各版本之间功能差异不大。选择版本时优先考虑稳定性和与当前系统的兼容性而不是追求新版本。常见 Linux 发行版官方源里带的 tree 版本都比较保守比如 CentOS 7 源里是 1.6.0Ubuntu 20.04 源里是 1.8.0这些都经过了充分测试使用上没有任何问题。嵌入式环境下选择版本要更谨慎。旧版内核的交叉编译工具链可能不支持太新的编译器特性而新版 tree 源码在某些极端情况下会使用较新的 C 标准特性导致旧工具链编译报错。我一般会先在目标机器上尝试编译如果报错再换旧版本。tree 源码包通常只有一个 .c 文件加一个 Makefile不需要复杂的 autoconf 环境兼容性已经比大多数开源软件好得多。4. 安装和使用避坑10 个真实踩过的坑4.1 编译报错make: gcc: Command not found现象在最小化安装的 CentOS 或精简版 Ubuntu 上执行make立刻报错make: gcc: Command not found。原因系统里只装了 make但没有装 gcc 编译器。最小化安装的服务器经常这样系统为了精简体积把编译工具链都砍掉了。解决按发行版装上 gcc 即可。Debian/Ubuntu 执行sudo apt-get install -y gccCentOS/RHEL 执行sudo yum install -y gcc。装上 gcc 后重新执行make就能正常编译了。4.2make install提示Permission denied现象make 编译成功但执行make install时提示/usr/local/bin: Permission denied安装失败。原因make 编译时用的是当前用户权限不会报错但make install要写 /usr/local/bin这个目录归属于 root普通用户没有写权限。解决用 sudo 执行sudo make install。如果是只在个人目录下用可以直接用make PREFIX$HOME/.local install完全绕开权限问题不需要 root 密码。4.3 安装成功后敲tree还是提示command not found现象安装过程没有任何报错tree 二进制文件也确实存在但新开终端输入 tree 提示找不到命令。原因shell 的 PATH 环境变量里没有包含 tree 的安装目录。默认安装到 /usr/local/bin 的话一般 PATH 里都有但用 PREFIX 装到自定义目录比如 /opt/software/binshell 默认不会去那里找命令。解决先用which tree确认安装路径如果which找不到直接用完整路径调用测试/opt/software/bin/tree。确认能用之后把安装目录加入 PATHexport PATH$PATH:/opt/software/bin写进 ~/.bashrc 后source ~/.bashrc永久生效。4.4 中文文件名显示成乱码现象tree 输出显示中文文件名时出现一堆十六进制转义字符或者问号完全看不懂。原因终端编码和系统 locale 不匹配。服务器系统 locale 设置错误或者 SSH 客户端的字符集配置不当导致 UTF-8 字符显示异常。解决确认系统的 locale 是 UTF-8执行locale查看当前设置如果显示 POSIX 或 C修改 /etc/locale.gen 或 ~/.bashrc 设置export LANGen_US.UTF-8。SSH 客户端也检查一下字符集设置Windows 上的终端模拟器建议设置为 UTF-8 编码。4.5 大目录执行 tree 卡死不动现象对一个包含几万个文件的目录执行 tree终端半天没反应CPU 占用飙升。原因tree 默认会递归遍历所有子目录和文件文件数量太多时递归过程耗时很长输出量巨大终端渲染也要消耗资源。解决先用-L 1限制深度看看顶层结构再逐层深入。用-d只看目录不看文件输出量大大减少。需要排除的目录用-I指定匹配模式比如tree -I node_modules|.git。4.6 输出中文目录名完全不显示现象目录名是中文的tree 输出时那一行完全空白少了一条线。原因locale 设置问题。系统 locale 不是 UTF-8或者终端传输字节流时把多字节字符截断了。解决同样先检查 localelocale命令确认输出里有 UTF-8。然后特地在 SSH 会话里设置export LANGC.UTF-8如果系统支持或者换成export LANGen_US.UTF-8。设置完重新执行 tree中文应该就能正常显示了。4.7 嵌入式环境编译报错rindex未定义现象在某个嵌入式 Linux 环境交叉编译 tree 时编译报错说rindex函数未定义。原因新版 tree 代码里用了rindex函数这个函数在 POSIX 标准中已经被strrchr取代某些精简的 C 库如 musl libc不再提供。解决修改 tree 的源码把代码里的rindex全部替换成strrchr。如果是 musl libc 环境最好在 Makefile 的 CFLAGS 里加上-D_GNU_SOURCE让代码声明优先使用新接口。具体改法是搜索源码文件里的 rindex 字符串手动改成 strrchr然后在 CFLAGS 加上-D_POSIX_C_SOURCE200809L强制启用新标准接口。4.8 终端输出的树形线条错乱现象tree 输出的树形线条断断续续竖线和横线对不齐结构混乱。原因终端字体或者宽字符渲染问题。某些终端字体对 UTF-8 线条字符支持不好或者系统 locale 设置不正确导致 tree 使用了 ASCII 字符之外的线条字符。解决强制 tree 使用 ASCII 字符绘制线条执行tree --charsetascii输出会变成纯 ASCII 字符的 -- 和 --。如果看着不习惯把终端字体换成一个对 Unicode 支持良好的字体比如 DejaVu Sans Mono同时确认 locale 是 UTF-8。4.9 同一目录 tree 和 ls 显示的文件数量不一致现象对同一目录执行tree | tail -1看统计行和ls | wc -l数出来的文件数量对不上。原因tree 的统计包含了隐藏文件和子目录里的所有文件ls 默认不显示隐藏文件而且不递归子目录。两者的统计方式完全不同数量不一致很正常。解决如果想对比用tree -a | tail -1看包含隐藏文件的统计用find . -type f | wc -l统计文件数这两个口径才一致。记住 tree 的统计行格式是「X directories, Y files」注意它只统计了目录和文件数量没有计算链接和特殊文件。4.10 排错用tree -L 2时把深度参数记混现象以为-L 2是显示两层目录加文件结果输出比预期多很多目录深一些的结构全被打印出来了。原因-L 参数限制的是树的层级深度第 1 层是当前目录第 2 层是当前目录下直接子级的内容。目录层级和你预期的「两层」可能不是同一个概念层级统计从根开始当前目录算第一层。解决记住-L 1只显示当前目录下的直接内容-L 2显示到孙级目录。要确定具体显示到哪一级先试-L 1看清直接子级再决定要不要加深。想要的效果只是确认某个子目录是否存在直接tree -L 1 | grep 子目录名就够了。5. 进阶用别名和输出格式把 tree 变成日常巡检工具5.1 配置别名把常用参数组合变成一个短命令tree 单独用很好用但每次都敲-L 2 -C --dirsfirst太啰嗦。我在实际使用中会把这些高频参数组合配成 alias让 tree 真正融入日常工作流。比如自定义一个只看目录树的 alias避免每次手打一长串参数。# 编辑 shell 配置文件 vim ~/.bashrc # 在文件末尾追加以下别名配置 alias tree2tree -L 2 -C --dirsfirst alias treedtree -d -L 3 alias treebigtree -h --du -dtree2是使用频率最高的限制两层深度、显示彩色、目录优先排列看工程结构最常用。treed只看前三级目录跟看目录骨架差不多排查部署目录位置时最快。treebig是把目录大小也一起显示出来配合--du参数计算目录总大小找磁盘占用大户的时候用。配好别名后执行source ~/.bashrc生效从此敲treed三个字母就能拿到清晰的目录树。5.2 让 tree 输出文件大小定位磁盘占用大户服务器磁盘报警是最常见的运维事故之一定位是哪个目录在疯狂吃磁盘空间tree 比 du 直观得多。用-h和--du组合tree 会在每个文件旁边标注大小每个子目录后面标注目录总大小一眼看出哪个目录最大。# 查看当前目录下各子目录占用空间 tree -h --du -L 2 # 只看目录不看文件排序更集中 tree -h --du -d -L 3 /var/log # 输出重定向到文件便于分析 tree -h --du -L 3 /tmp/tree_report.txt-h让文件大小变成人类可读的格式K/M/G 单位一目了然不用数零。--du参数让每个目录都显示累计大小包括所有子目录内容。-L 2限制深度避免输出内容过长。分析的时候先看第二层目录的大小最大的那个目录就是主要占用磁盘空间的目标再单独对它执行 tree 深入排查。这个组合比 du -sh 先查一层再手动 cd 进去逐层查要快得多。5.3 用 -I 参数排除噪声目录让输出聚焦真实内容Node.js 项目的 node_modules、Git 仓库的 .git、Python 虚拟环境的 venv这些目录动辄几万个文件一旦 tree 把它们算进去输出直接爆炸。-I参数可以用通配符排除指定模式的文件或目录。# 排除 node_modules 和 .git 目录 tree -L 2 -I node_modules|.git # 排除所有隐藏目录以 . 开头的目录 tree -L 2 -I .* # 排除多个特定目录 tree -L 3 -I node_modules|.git|dist|build-I的参数是一个匹配模式用竖线分隔多个模式支持通配符。node_modules|.git会排除所有名字叫 node_modules 或 .git 的目录不管它们在树的哪一层。.*会排除所有以点开头的隐藏目录。这个参数在实际使用中非常重要没有它看一个依赖很多的项目目录时输出几乎全是 node_modules 的文件真正的业务代码被淹没在里面。5.4 JSON 和 XML 输出把目录结构交给脚本处理tree 不仅能人眼查看还能输出结构化的 JSON 和 XML 格式供脚本解析。这个功能在自动化巡检、配置管理、生成文件清单时特别有用。# 输出 JSON 格式的目录结构2.0.0 以上版本支持 tree -J -L 2 # 输出 XML 格式的目录结构 tree -X -L 2 # 用 python 解析 JSON 结果 tree -J -L 2 | python3 -m json.tool-J参数让 tree 输出 JSON 数组格式每个文件对象里有 name、typefile/directory等字段。-X输出 XML 格式包含同样的信息。第三个命令管道输出给 python3 的 json.tool 模块把 JSON 格式化打印方便查看结构。实际场景里可以用一条命令把整个项目的文件清单导成 JSON再交给脚本做文件存在性检查、目录结构变更监控、或者生成资产管理清单。5.5 实战组合一条命令输出完整的项目结构快照把前面所有技巧合在一起就能做出一条生产环境可用的「目录快照」命令。我处理服务器故障时第一件事就是先把出问题的项目目录结构打出来存档对比快照之间哪里变了排查问题会快很多。# 生产环境可用的目录快照命令 tree /opt/myapp -a -h --dirsfirst -L 3 -I node_modules|.git|*.log -o /tmp/myapp_snapshot_$(date %Y%m%d).txt # 用完整路径显示文件方便复制路径 tree /opt/myapp -f -L 2 | head -50 # 配合 grep 过滤出目标文件 tree /opt/myapp -f | grep config.*.yml第一条命令把应用目录的树形结构存档到带日期的文本文件里隐藏文件也包含文件大小也显示过滤掉了依赖目录和日志文件。第二条输出完整路径前缀看配置文件位置时不用手动拼接路径。第三条用 grep 过滤输出快速定位匹配特定模式的文件。这三条是我日常排查问题的固定开场动作文件乱不乱、多了什么少了什么、配置在哪层路径一份快照全部看清。从那以后我每次排查生产环境问题都强制自己先跑一遍 tree 快照再动手改任何东西等把结果存档成文本再开始操作。目录结构是排查问题的基础坐标系坐标系画错了后面全是白忙。这份资源里的 tgz 包正好解决了内网装不上 tree 的尴尬希望帮到你。本文还有配套的精品资源点击获取
返回列表