Skip to main content

Linux tree 命令

· 4 min read

tree 把一个目录变成终端里的一棵树。日常使用记住两个参数就够了。

  1. -L N 限制展示层级,默认无限制,深层目录直接输出爆炸。
  2. -a 控制隐藏文件可见性,默认不显示 . 开头的文件和目录。
  3. tree -L 2 -a 是覆盖大多数日常开发场景的组合。
  4. -d 只看目录骨架,跳过文件层噪音。
  5. -I 'node_modules|.git' 排除指定目录,tree 输出立刻清爽。
  6. macOS 不自带,brew install tree 一行安装。
  7. 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)。记住这两个维度就够了,其余选项都是锦上添花。