Linux tree 命令
tree 把一个目录变成终端里的一棵树。日常使用记住两个参数就够了。
-L N限制展示层级,默认无限制,深层目录直接输出爆炸。-a控制隐藏文件可见性,默认不显示.开头的文件和目录。tree -L 2 -a是覆盖大多数 日常开发场景的组合。-d只看目录骨架,跳过文件层噪音。-I 'node_modules|.git'排除指定目录,tree 输出立刻清爽。- macOS 不自带,
brew install tree一行安装。 - tree 的设计逻辑就两个维度:深度控制、可见性控制。
默认行为
不加任何参数直接跑 tree,行为就两条:
- 从当前目录开始,递归展开所有子目录
- 跳过所有以
.开头的隐藏文件
第二条让很多人踩过坑——在一个 npm 项目根目录跑 tree,以为能看清项目全貌,结果 .gitignore、.env 这些关键文件一条都没出现,反过来还要想半天"是不是文件丢了"。
-L:控制递归深度
-L 解决的核心问题是"目录太深,输出刷屏"。
随便进一个 node 项目,不加限制跑 tree:
$ tree
.
├── src
│ ├── components
│ │ ├── Header
│ │ │ ├── index.tsx
│ │ │ ├── style.module.css
│ │ │ └── types.ts
│ │ ├── Sidebar
│ │ │ ├── ...
如果你的项目有 node_modules,输出能刷到天荒地老——几千行树形输出,根本没法读。
默认值是无限递归,这在实际项目里基本等于"没用"。我每次跑 tree 必带 -L,通常 -L 2 就够看清楚项目骨架:
$ tree -L 2
.
├── blog/
│ ├── ai-agent/
│ ├── fullstack/
│ └── 3d-manufacturing/
├── docs/
│ ├── agent/
│ └── finance-consumption/
├── src/
│ ├── components/
│ ├── css/
│ └── pages/
├── docusaurus.config.ts
├── package.json
└── tsconfig.json
第二层是目录,再往下是文件细节——你想要的"项目长什么样",-L 2 刚好给到了。
-L 3 适合想看具体文件但不想被深层嵌套淹没的场景。再往上基本就是看单个目录了,没必要用 tree,直接 ls -la 更快。
有个关联选项 -R:当命中 -L 限制时,会打印一行提示告诉你还有更深的内容。聊胜于无,我没怎么用过。
-a:显示隐藏文件
-a 解决的是"想看的文件默认被藏起来了"的问题。
tree 默认不显示隐藏文件——这不是 bug,是沿袭了 Unix ls 的设计惯例。但在现代项目中,以 . 开头的文件往往是配置层的核心:
.gitignore、.gitattributes.env、.env.local.eslintrc、.prettierrc.github/workflows/整个目录.husky/、.vscode/settings.json
这些文件定义的是项目的"元规则",不知道它们存在,你就读不懂项目的运行方式。
日常直接用 tree -a -L 2 是最实际的——骨架 + 隐藏文件一起看。
不加 -a 时,上面那堆配置文件全部隐身在 tree 的输出里。尤其是接手别人项目的头五分钟,tree -a -L 2 能帮你快速建立项目的脑内地图。
其他值得记住的选项
-d:只看目录,跳过所有文件。适合只想了解组织方式、不在乎文件细节的时候。
tree -d -L 3 # 只画目录树,3 层深
-I:排除指定模式。前端项目必备,不加这个 node_modules 能让 tree 跑到地老天荒。
tree -L 3 -I 'node_modules|.git|dist|.next'
-I 支持 | 分隔多个 pattern,一次排除所有噪音目录。这是我最常用的组合拳——既能看清结构,又不会被构建产物淹没。
-f:显示每个文件的完整路径前缀。需要复制路径给同事时有用。
--dirsfirst:目录排前面,文件排后面。tree 默认是字母序混排,开了这个选项输出更符合直觉。
安装
macOS 默认不带 tree,一行命令搞定:
brew install tree
Linux 各发行版通常包管理器自带(apt install tree / yum install tree)。
Windows 的话……你大概率在用 WSL,同上。
一句话总结
tree 做的事很简单,就是把 ls -R 的输出变成人能读的树形结构。它的全部复杂度就在两个维度上:往下走多深(-L)和哪些东西要露出来(-a、-I)。记住这两个维度就够了,其余选项都是锦上添花。