在 Linux 中,目錄樹最常見的做法是使用 tree 指令產生,但像 Directory Tree Generator 這類以路徑清單為基礎的工具,能直接從一組相對檔案路徑清單建立出可確定、可複製貼上的目錄樹,且不需要在目標機器上取得 shell 存取權限。Linux 的 tree 指令只有在能對真實檔案系統執行程式時才能運作,它會相依於套件是否已安裝,而且其輸出反映的是當下磁碟上的實際內容。相對地,產生器接受你已有的純文字相對檔案路徑清單,逐一驗證每一行,從共用前置字串推導出目錄結構,並使用 Unicode 或 ASCII 的連接符號呈現結果。整個流程——驗證、樹狀結構建構、排序與繪製——都在當前的瀏覽器分頁中執行,因此專案名稱與資料夾結構永遠不會離開你的機器。這使得這種做法非常適合用來為 Linux 專案撰寫 README 文件、為議題附加目錄圖,或在不給予 shell 存取權限的情況下,向團隊成員展示部署的整體結構。

how to get directory tree in linux
在 Linux 中不使用 tree 指令取得目錄樹

為何路徑清單式的目錄樹往往就是你真正需要的

搜尋「how to get a directory tree in Linux」通常會得到 tree、ls -R 或 find 單行指令,而這些工具各自都有擅長的場景。它們都是在目標系統上執行,都反映實際的檔案系統,也都需要具備 shell 存取權限的人來呼叫。當情境正好如此——你正坐在 Linux 提示符前想要查看結構——這些指令就是正確的解答。

有幾個實際的工作流程恰好落在這個舒適圈之外。你可能想把目錄樹附加到 GitHub 議題中,但手上只有一張螢幕截圖或同事貼給你的內容。你可能在記錄一部已經無法存取的伺服器,只能依據一份已儲存的路徑清單來撰寫。你可能希望在某份 Markdown 文件中放一棵樹,讓它在每位讀者的螢幕上都以相同的方式呈現,且不含 ANSI 顏色碼。或者你可能希望得到一棵具確定性的樹,讓兩位輸入相同路徑的隊友能得到位元級完全相同的輸出,不受 Linux 發行版本或檔案系統排序規則影響。

路徑清單產生器是不同類型的工具。它不是檔案系統掃描器,也不會檢查你輸入的路徑是否真實存在;它是一個具確定性的文字轉換器。這個區別很重要,因為正因為如此,相同的輸入才能在每個支援的瀏覽器上產生相同的樹,也因為如此,關於你專案的一切內容都不會離開輸入時所使用的那台機器。

將 Linux 檔案路徑整理成可直接貼上的清單

產生器要求每一行只放一條完整的相對檔案路徑,且所有行使用相同的分隔符號。在 Linux 機器上能產生的多數路徑清單本身就已符合這個格式,因此第一個步驟就是收集它們,並修剪掉 shell 所附加的多餘內容。

三個指令即可涵蓋常見的情境。每個都會以相對於當前目錄的形式,每行輸出一條路徑,這正是產生器直接接受的格式:

  • find . -type f -printf '%P\n' —— 列出當前目錄下所有一般檔案的路徑,不含前置的 ./,除非你額外加入篩選條件,否則不會遞迴進入 .git。
  • find . -type f | sed 's|^\./||' —— 在沒有 -printf 選項時達到相同效果,使用一個字元的 sed 替換來去掉 find 預設加上的 ./ 前綴。
  • tree -fi --noreport —— tree 處於全路徑模式(-f),不縮排(-i)且不附加尾端摘要資訊(--noreport)。輸出為每行一條路徑,可直接貼上;你還可以加上 --gitignore 或透過 grep -v 來排除產生的檔案。

若想做快速的健全性檢查,Basic Linux Commands 速查表 列出了一些保守的範本,能在不具破壞性的前提下產生乾淨的輸出。取得清單後,直接貼入輸入框即可。空白的尾端行、單獨的歸位字元、絕對路徑、磁碟根目錄路徑、點(dot)段,以及向上的父目錄跳躍段都會被拒絕,因此產生器會把錯誤直接呈現在清單本身,而不是產出一棵誤導人的樹。

在 Directory Tree Generator 中建立目錄樹

  1. 每行貼上一條完整的相對檔案路徑。所有路徑保持統一的分隔符號風格。每一行代表一個檔案,而非目錄宣告,因此父層資料夾會從共用前置字串推導出來。例如 src/components/Button.tsx 和 src/index.ts 合在一起,就意味著有一個 src 目錄,內含 components 目錄與 index.ts 檔案。
  2. 選擇與輸入相符的分隔符號。像 src/lib/parser.ts 這類使用正斜線,或像 src\lib\parser.ts 這類使用反斜線。系統會拒絕在同一輪輸入中混用相反的分隔符號,而不是進行猜測或默默替換。
  3. 選擇 Unicode 或 ASCII 的樹狀字元。Unicode 模式使用方框繪製連接符號;ASCII 模式使用一般鍵盤字元,因此在不支援方框繪製字符的終端機或文件中,樹狀結構依然清晰可讀。
  4. 點擊 Generate tree。產生器會逐行驗證、建構前置字串樹、在每一層中以 UTF-16 字碼單元比較排序,使目錄排在檔案之前,並從一個單獨的點根目錄開始繪製結果。
  5. 檢視節點數與完整樹狀結構,然後複製。輸出面板會顯示繪製後的樹與節點數量。直接複製到 README、議題、程式碼審查或支援訊息中即可。若無法取得剪貼簿權限,完整輸出仍會保持可見且可選取,供手動複製。

分隔符號、連接符號與驗證規則

產生器的三項特性在設計上是嚴格的,了解它們能避免新手遇到的大部分挫折。

分隔符號處理。工具會拒絕在同一輪輸入中混用不同的分隔符號。前置分隔符號、Windows 磁碟根目錄形式、由重複或尾端分隔符號所產生的空段、當前目錄段,以及父目錄跳躍段都會被拒絕。產生器不會在你不知情的情況下,把一個具危險性或模稜兩可的路徑「標準化」成另一個路徑,因此你在輸入框看到的內容,就會原封不動地成為樹狀結構的一部分。

名稱保留。一般的空格、點、前置點,以及字母大小寫,都會依照你輸入的樣子完整保留。不會進行修剪、轉小寫、slugify、解碼或重新命名。README draft.md、.env.example、archive.v1 與 data file.json 都能原樣往返而不變動。ASCII 控制字元(包括單獨的歸位字元)會被拒絕,因為它們可能切斷終端機輸出,或使顯示出來的樹產生誤導。

檔案與目錄衝突規則。每一行宣告的是一個檔案。因此一行獨立的 src 代表一個名為 src 的檔案,而非資料夾;而 src/index.ts 則會建立一個 src 目錄,內含 index.ts。同時提供 src 與 src/index.ts 構成明確的檔案/目錄衝突,因此會被拒絕。重複的路徑同樣會被拒絕,而不是默默地去重,因為合併它們會改變輸入本身的語意。相同的檢查也會拒絕在已經包含子項的前綴下宣告檔案,無論方向為何。

連接符號風格中層分支最終分支延續行
Unicode(方框繪製)├──└──│
ASCII(僅鍵盤字元)|--`--|

兩種模式下的結構規則完全相同:在每一層中,目錄會排在檔案之前,而在這兩組之中,名稱會依照具確定性的 UTF-16 字碼單元比較進行排序,而非依據瀏覽器的語系、作業系統的排序規則、輸入順序或檔案系統的中繼資料。在 Unicode 與 ASCII 之間切換會立刻清除先前產生的樹,因此先前的輸出不會被誤認為是當前設定下的結果。

將目錄樹貼到它該出現的地方

乾淨的目錄樹在三種地方最有用,而在每個地方所需要的格式略有不同。

README 與入門文件。在專案 README 頂端放一段樹狀結構,讓新貢獻者不必親自 clone 並查看程式碼,就能掌握程式碼庫的全貌。由於輸出為純文字且不含 ANSI 跳脫碼,可直接貼入 Markdown 的圍欄程式碼區塊,無需任何前置處理。若希望樹狀結構在各版本間保持穩定,請以一份精選的小型路徑清單作為錨點,而非整個檔案系統;審閱者可以在同一處更新清單並重新產生樹狀結構。

議題討論串與程式碼審查。當錯誤回報或 pull-request 留言需要補充脈絡時,一段指向相關模組的簡短樹狀結構,比一整面密密麻麻的檔名更容易瀏覽。Unicode 模式能產生精簡且分枝清楚的輸出,在 GitHub、GitLab 與 Bitbucket 的留言中都能良好呈現;而當目的地是純文字電子郵件,或可能不支援方框繪製字符的終端機時,ASCII 模式是較安全的選擇。

架構說明與支援訊息。附加到架構決策記錄、Runbook 或廠商支援單中的目錄圖,能將「上傳服務」這類純文字描述轉化為外人一眼就能驗證的形式。有兩點值得再提醒一次。專案的目錄樹即使不含檔案內容,仍可能揭露內部模組名稱、客戶名稱、部署配置或具安全敏感性的檔名,因此發布前請務必檢視樹狀內容。產生器不會遮蔽機密資訊、不會檢查忽略檔、不會標記符號連結、不會計算大小、不會附加檔案註解、不會探索權限,也不會比較輸入清單與真實儲存庫,因此請將它視為具確定性的文字轉換器,而非檔案系統掃描器。

延伸閱讀:How to Get a Cron Job List in Linux。