OOZOU
与我们联系
返回 TIL 列表
shell

列出文件树的 Zsh function

October 13, 2020

在命令行浏览目录时,若能以“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:

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 工作流程,就能提升命令行体验,让目录浏览轻松许多。

更多关于 shell 的笔记

shellDecember 8, 2020

在 Bash 和 Zsh 运行无痕/私密命令

只要在命令前面加一个空格,它就不会被存进 ~/.bash\_history。例如 qrencode -o out.png "Some secret text"

shellOctober 22, 2020

用 homebrew 升级 postgres 数据库

要升级 postgres,可以运行

shellOctober 13, 2020

用 Amazon AWS S3 CLI 复制文件并设置权限

打开 term(或同类终端)并粘贴下面的内容:

有项目想法吗?

我们很想听听您正在做的产品。

开始对话hello@oozou.com
OOZOU Logo

曼谷 · 新加坡 · 香港

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

服务

  • Web 开发
  • AI 智能体与生成式 AI
  • 移动应用开发
  • 数据分析与工程
  • UI/UX 与产品设计
  • 数字化转型

公司

  • 关于我们
  • 加入我们
  • 博客
  • 案例研究
  • Today I Learned
  • 联系我们

更多

  • 行业
  • 合作伙伴网络
© 2026 OOZOU. 版权所有。
隐私政策行为准则反贿赂反贪腐政策