本文目录导读:

📚 文章目录导读
- 为什么你需要用脚本生成目录树? —— 解决文件管理的“最后一公里”痛点
- 核心原理 —— 读懂
tree命令与 Python/Shell 脚本的底层逻辑 - 实战方案一 —— Windows 原生 CMD 与 PowerShell 脚本(零成本,开箱即用)
- 实战方案二 —— Python 脚本深度定制(过滤、排序、输出 Markdown)
- 实战方案三 —— Bash 一行流与
find命令的进阶玩法(Linux/macOS) - 高频问答 (FAQ) —— 解决你关于目录树脚本的 99% 疑问
在日常开发、文档编写或数据交接时,一份清晰的目录树(Folder Tree)往往比冗长的文字描述更直观,很多新手面对几十层嵌套的文件夹时,会选择手动用 和 去画,这不仅耗时,而且极易出错,我们就深入探讨怎么用脚本生成目录树,帮你彻底解放双手,并让你掌握三种不同环境下的核心技巧,这不仅提升效率,更是专业工程师的必备素养。
为什么你需要用脚本生成目录树?
想象一下,你接手了一个半年没维护的项目,里面有上千个文件,你需要快速向领导汇报结构,或者写技术文档,如果靠手动截图或画树,大概率会漏掉文件或层级错误,而脚本生成目录树具备实时性、一致性和可定制性,更重要的是,在后端开发中,CI/CD 流水线可以用脚本自动校验目录结构是否合规,这已经上升到了工程化自动化的层面。
核心原理:看似神秘,实则简单
生成目录树的本质是递归遍历,程序从根目录出发,扫描当前层级的文件和文件夹,如果发现子文件夹,则进入下一层级继续扫描,直到没有更深层文件夹为止,过程中记录每个节点的深度,最后根据深度绘制连接符号(如 、 和 ),理解了递归和深度记录,你就能举一反三。
实战方案一:Windows 原生 CMD 与 PowerShell
对于大多数非程序员,Windows 自带命令是最快的,打开 CMD,输入经典指令:
tree /F
/F 参数会显示所有子文件夹内的文件,不加则仅显示文件夹,但 CMD 默认编码为 GBK,中文可能乱码,且输出格式固定。
PowerShell 进阶脚本: 如果要过滤掉某些文件夹(如 node_modules),可以这样写:
function Get-Tree($path, $prefix = '') {
$items = Get-ChildItem $path | Where-Object { $_.Name -notlike 'node_modules' }
for ($i=0; $i -lt $items.Count; $i++) {
$item = $items[$i]
$isLast = ($i -eq $items.Count - 1)
$connector = if ($isLast) { '└── ' } else { '├── ' }
Write-Output ($prefix + $connector + $item.Name)
if ($item.PSIsContainer) {
$newPrefix = $prefix + $(if ($isLast) { ' ' } else { '│ ' })
Get-Tree $item.FullName $newPrefix
}
}
}
Get-Tree "C:\YourProject"
这段脚本将结果完美输出,支持 Unicode 字符,非常适合在 Windows Terminal 中使用。
实战方案二:Python 脚本(跨平台 + 深度定制)
Python 是跨平台利器,利用 os.walk 能极简实现:
import os
def generate_tree(path, prefix='', ignore_dirs=None):
if ignore_dirs is None:
ignore_dirs = ['.git', '__pycache__', 'node_modules']
entries = sorted(os.listdir(path))
entries = [e for e in entries if e not in ignore_dirs and not e.startswith('.')]
for index, entry in enumerate(entries):
is_last = index == len(entries) - 1
connector = '└── ' if is_last else '├── '
print(prefix + connector + entry)
full_path = os.path.join(path, entry)
if os.path.isdir(full_path):
extension = ' ' if is_last else '│ '
generate_tree(full_path, prefix + extension, ignore_dirs)
generate_tree('.')
精华所在: 这段代码仅用 10 行,就实现了忽略隐藏文件和指定目录、对齐缩进、排序显示,你可以将这脚本保存为 在云端服务器或 Mac 上,最优雅的方式是使用 深度控制是这里的关键词,通过 问:执行 Python 脚本时报错 问:如何生成目录树并统计文件大小?
答:在 Python 中,可以使用 问:如何让脚本不遍历软链接或符号链接,防止死循环?
答:在 问:生成的目录树能否直接在 GitHub 的 README 中渲染?
答:可以,但需将输出调整为 Markdown 格式,将连接符改为 ,并用 通过以上三种方案,你已经全面掌握了怎么用脚本生成目录树,无论是零成本的 CMD,还是高度定制的 Python,都离不开“递归”的思想,现在就动手写一个属于自己的脚本吧,把磁盘里乱糟糟的项目瞬间梳理成清晰的画作,如果你还有其他关于自动化效率提升的问题,欢迎在评论区留言,我们一起探讨。
tree_generator.py,并直接修改 ignore_dirs 列表来适应不同项目,如果要把输出保存为 Markdown 格式,只需修改 print 函数,加上 [TOC]
实战方案三:Linux/macOS 的 Bash 与 find
tree 命令(需先安装:brew install tree 或 apt install tree),但为了展示脚本的灵活性,我们不妨用 Bash 函数解决:tree_ls() {
local path="${1:-.}"
local prefix="${2:-}"
local depth="${3:-2}" # 控制最大深度
find "$path" -maxdepth "$depth" -print | sort | awk '{
# 复杂逻辑,这里用简易版本展示
n=split($0, a, "/");
indent="";
for(i=2; i<n; i++) indent=indent " ";
print indent "├── " a[n]
}'
}
tree_ls /your/project 1
-maxdepth 参数,你可以避免输出成百上千行,在搜索引擎优化(SEO)角度,这也符合用户对“快速预览”的搜索意图。
❓ 高频问答 (FAQ)
UnicodeEncodeError 怎么办?
答:这是因为 Windows 控制台默认编码问题,在脚本首行加入 import sys 和 sys.stdout.reconfigure(encoding='utf-8')(Python 3.7+),或在运行时设置环境变量 PYTHONIOENCODING=utf-8。os.path.getsize() 累加每个文件的大小,并在输出时格式化显示,这也是优化网站内部结构时,分析资源占用率的有效脚本手段。os.walk 中添加 followlinks=False 参数(默认即为 False),在 Bash 的 find 命令后加 -type f 排除链接。<details> 标签包裹,或者使用 <!-- tree generated --> 注释包裹,然后借助 GitHub 的 Mermaid 流程图,但最简单的是复制成纯文本并用代码块 ``` 括起来。