---
title: "列出文件树的 Zsh function"
description: "在命令行浏览目录时，若能以“tree”格式查看目录和子目录的结构，通常会很有帮助。虽然已经有很多现成工具，例如…"
canonical: https://oozou.com/til/zsh-function-to-list-file-tree-17
locale: zh-Hans
date: 2020-10-13
topic: shell
---

# 列出文件树的 Zsh function

> 在命令行浏览目录时，若能以“tree”格式查看目录和子目录的结构，通常会很有帮助。虽然已经有很多现成工具，例如…

Published: 2020-10-13 · Topic: [shell](https://oozou.com/zh-Hans/til-topics/shell) ([markdown](https://oozou.com/zh-Hans/til-topics/shell.md))

在命令行浏览目录时，若能以“tree”格式查看目录和子目录的结构，通常会很有帮助。虽然已经有很多现成工具，例如 tree，但有时你可能想要一个直接集成进 shell 的简单自定义方案。在这篇文章中，我们会一步步创建一个简单的 **Zsh** function，以 tree 格式列出目录结构。

# 创建列出文件树的 Zsh function

如果你用 **Zsh** 作为默认 shell，在 .zshrc 文件加入自定义 function，就能打造一个快速高效的命令，以树状结构查看目录。这个 function 的工作方式类似热门的 tree 命令，但它是用 **ls** 和 **sed** 实现的，很容易直接集成进你的 Zsh 环境。

**步骤 1：把 lst() function 加进 .zshrc**

第一步是在你的 .zshrc 文件中定义 lst() function。这个 function 接受一个可选参数，可以是任何目录路径，并从该处开始列出目录树。如果没有指定目录，默认会使用当前目录。  

用你顺手的文本编辑器打开 .zshrc 文件，加入以下 function：

```zsh
lst() {
    if [ "$1" != "" ] # or better, if [ -n "$1" ]
    then
        ls -R $1 | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    else
        ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    fi
}
```

**步骤 2：重新加载 Zsh 设置**

加入 function 之后，你需要重新加载 .zshrc 文件让变更生效。在终端运行以下命令即可：

```
sh
source ~/.zshrc
```

**步骤 3：使用 lst() function**

把 function 加进 .zshrc 之后，你就可以马上开始使用。lst() function 让你能以 tree 格式列出指定目录中所有的子目录。用法如下：

要列出某个文件夹（例如 spec）的子目录，运行：

```
sh
lst spec
```

这个命令会生成树状结构，列出 spec 文件夹内所有的子目录。

如果你想查看当前目录的树状结构，只要运行：

```
sh
lst
```

lst() function 会输出文件夹结构，让你更容易理解目录的层级。  

**输出示例**

假设你有以下目录结构：

```
bash
spec/
├── controllers/
│   └── users/
├── models/
└── views/
```

运行 lst spec 命令会得到类似下面的输出：

```
css
   spec
   |--controllers
   |   |--users
   |--models
   |--views
```

这个简单的树状结构让你能轻松看出目录和子目录之间的关系。  

**工作原理**

我们一步步拆解这个 function：

1. **ls -R $1**：ls -R 命令会递归列出目录的内容（如果没有提供参数，就列出当前目录）。
2. **grep ":$"**：过滤结果，只显示目录名称（以 : 结尾的行）。
3. **sed 命令**：
   - **'s/:$//'**：移除每个目录名称结尾的冒号。
   - **'s/[^-][^\/]\*\//--/g'**：把斜杠（/）换成连字符（--），让结构转换成树状格式。
   - **'s/^/ /'**：为目录树加上缩进。
   - **'s/-/|/'**：把连字符换成竖线（|），进一步强化树状格式。

**步骤 4：自定义 lst() function**

你可以轻松自定义 lst() function 来满足自己的需求。比如，你可以改变树状结构的格式，或加入列出文件的额外选项。如果你经常需要同时列出文件和目录，可以移除只显示目录的 grep 过滤条件，让 function 也包含文件。  

**替代方案：使用 tree 命令**

如果你偏好现成工具，可以使用专门用来显示目录结构的 tree 命令。tree 是相当常见的工具，大多数类 Unix 系统都能安装。要安装 tree，按你的系统选择以下其中一条命令：  

**在 Ubuntu 或 Debian 系的系统上**：

```
sh
sudo apt-get install tree
```

**在 macOS 上**：

```
sh
brew install tree
```

安装完成后，就可以用 tree 命令产生类似的输出：

```
sh
tree spec
```

tree 命令内置更多功能，例如显示文件大小、权限等等。不过，如果你偏好保持简单，或是无法使用 tree，lst() function 就是很棒的轻量替代方案。

**结语**

我们创建的这个 **Zsh function** 提供了一种简单高效的方式，以 tree 格式列出目录结构。把 lst() function 加进 .zshrc 文件后，你就能快速可视化系统中任何文件夹的子目录。这对于浏览复杂的目录结构、理解项目中文件与文件夹的层级非常有用。

如果你需要更多功能，可以考虑使用 tree 命令来获得更高级的特性。不过，若想要直接集成进 Zsh shell 的轻量自定义方案，lst() function 是完美的选择。

# 

---

# 常见问题

**1. lst() function 是做什么用的？**

lst() function 是一个自定义的 Zsh function，会以 tree 格式显示目录结构。它使用 ls 和 sed 来格式化输出，让你能直接在终端中可视化文件夹层级。

**2. 要怎么把 lst() function 加进我的 Zsh 设置？**

编辑你的 .zshrc 文件，把 function 定义贴进去即可。之后运行 source ~/.zshrc 重新加载设置，这个 function 就能使用了。

**3. 我可以自定义 lst() function 的输出吗？**

可以，你可以修改负责格式化输出的 sed 命令来自定义这个 function。你可以改变树状结构、加入更多细节，甚至把文件也列进来。

**4. lst() function 有什么替代方案？**

tree 命令是一个常见的工具，会以 tree 格式显示目录结构。它提供比 lst() function 更多的功能，而且大多数类 Unix 系统都能安装。

**5. 我可以在 Zsh 以外的环境使用 lst() function 吗？**

lst() function 是为 Zsh 写的，但也能轻松改用于其他 shell，例如 Bash，只要把它加进对应的配置文件即可（Bash 是 .bashrc）。

把 lst() function 集成进你的 Zsh 工作流程，就能提升命令行体验，让目录浏览轻松许多。

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/zh-Hans/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
