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

服務

  • Web 開發
  • AI 代理人與生成式 AI
  • 行動應用開發
  • 數據分析與工程
  • UI/UX 與產品設計
  • 數位轉型

公司

  • 關於我們
  • 職涯
  • 部落格
  • 案例研究
  • Today I Learned
  • 聯繫我們

更多

  • 產業
  • 合作夥伴網絡
© 2026 OOZOU. 版權所有。
隱私政策行為準則反賄賂反貪腐政策