---
title: "列出檔案樹的 Zsh function"
description: "在命令列瀏覽目錄時，若能以「tree」格式查看目錄與子目錄的結構，通常會很有幫助。雖然已經有很多現成工具，例如…"
canonical: https://oozou.com/til/zsh-function-to-list-file-tree-17
locale: zh-Hant
date: 2020-10-13
topic: shell
---

# 列出檔案樹的 Zsh function

> 在命令列瀏覽目錄時，若能以「tree」格式查看目錄與子目錄的結構，通常會很有幫助。雖然已經有很多現成工具，例如…

Published: 2020-10-13 · Topic: [shell](https://oozou.com/zh-Hant/til-topics/shell) ([markdown](https://oozou.com/zh-Hant/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-Hant/contact

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