--
:
--
:
--
1981 字
8 分钟
-- 次
计算目录层级深度
最后更新于:
计算目录层级深度
目录
[toc]
需求
我想知道docs目录下有多少层目录级别?请帮我写一个shell或者python脚本?
例如 docs/目录1/目录2/xx.md 这个就算3级目录。
代码位置
本地百度云同步空间:count_dir_level

豆包输出
以下是优化后的 Python 脚本,新增了最大层级目录路径的识别(支持多个目录达到最大层级的场景),同时优化了输出格式,让结果更直观:
1#!/usr/bin/env python3
2import os
3import platform
4
5def count_max_dir_level():
6 # 目标目录(可根据需要修改)
7 TARGET_DIR = "docs"
8 # 规范化路径(处理不同系统的路径分隔符)
9 TARGET_DIR = os.path.normpath(TARGET_DIR)
10
11 # 检查目录是否存在
12 if not os.path.isdir(TARGET_DIR):
13 print(f"❌ 错误:目录 '{TARGET_DIR}' 不存在!")
14 return
15
16 max_level = 0
17 # 存储所有达到最大层级的目录路径(可能多个)
18 max_level_dirs = []
19
20 # 遍历docs目录树(root=当前目录路径,files=当前目录下的文件列表)
21 for root, _, files in os.walk(TARGET_DIR):
22 # 仅处理包含文件的目录(空目录不统计,与原规则一致)
23 if not files:
24 continue
25
26 # 计算当前目录相对于docs的路径
27 rel_path = os.path.relpath(root, TARGET_DIR)
28 # 计算层级:docs根目录为1级,子目录逐层+1
29 if rel_path == '.':
30 level = 1
31 else:
32 # 兼容Windows(\)和Linux(/)路径分隔符
33 level = len(os.path.normpath(rel_path).split(os.sep)) + 1
34
35 # 更新最大层级和对应目录
36 if level > max_level:
37 max_level = level
38 max_level_dirs = [root] # 重置列表,存入当前目录
39 elif level == max_level:
40 max_level_dirs.append(root) # 新增同层级目录
41
42 # 处理无文件的情况
43 if max_level == 0:
44 print(f"📂 目录 '{TARGET_DIR}' 下未找到任何文件!")
45 return
46
47 # 格式化输出结果
48 print("=" * 50)
49 print(f"📊 docs目录下的最大目录层级:{max_level}")
50 print(f"📍 达到最大层级的目录数量:{len(max_level_dirs)}")
51 print("=" * 50)
52 print("📁 最大层级的目录路径列表:")
53 # 去重(避免os.walk重复遍历的极端情况)+ 按路径排序
54 unique_dirs = sorted(list(set(max_level_dirs)))
55 for idx, dir_path in enumerate(unique_dirs, 1):
56 # 可选:显示绝对路径(注释掉则显示相对路径)
57 # dir_path = os.path.abspath(dir_path)
58 print(f" {idx}. {dir_path} (层级:{max_level})")
59
60if __name__ == "__main__":
61 # 适配Windows终端中文显示
62 if platform.system() == "Windows":
63 import subprocess
64 subprocess.call("", shell=True) # 修复Windows编码问题
65 count_max_dir_level()
核心优化点
- 记录最大层级目录:
- 用列表
max_level_dirs存储所有达到最大层级的目录(支持多个目录同层级的场景); - 遍历中动态更新:层级更大则重置列表,层级相等则追加目录。
- 用列表
- 路径友好处理:
- 自动兼容 Windows(
\) 和 Linux/macOS(/) 路径分隔符; - 可选显示「相对路径」或「绝对路径」(注释/取消注释对应行即可);
- 自动去重 + 排序,避免重复路径干扰。
- 自动兼容 Windows(
- 更友好的输出:
- 增加图标和分隔线,结果更易读;
- 显示目录数量、每个路径的层级;
- 处理「docs下无文件」的边界情况,避免报错。
- Windows 兼容:
- 修复 Windows 终端中文乱码问题;
- 路径规范化,避免
\\转义符干扰。
示例输出
假设目录结构:
1docs/
2├── dir1/
3│ └── dir2/
4│ └── dir3/
5│ └── a.md # 层级4
6├── dirA/
7│ └── dirB/
8│ └── dirC/
9│ └── b.md # 层级4
10└── test.md # 层级1
脚本输出:
1==================================================
2📊 docs目录下的最大目录层级:4
3📍 达到最大层级的目录数量:2
4==================================================
5📁 最大层级的目录路径列表:
6 1. docs/dir1/dir2/dir3 (层级:4)
7 2. docs/dirA/dirB/dirC (层级:4)
自定义说明
- 如需显示绝对路径:取消注释
dir_path = os.path.abspath(dir_path)即可; - 如需统计「空目录」:删除
if not files: continue这一行(但与你原示例「按文件路径统计」的规则不符); - 如需修改目标目录:修改
TARGET_DIR = "docs"为你的实际路径(如./docs、/home/user/docs等)。
最终脚本
count_dir_level.py脚本内容:
1
2#!/usr/bin/env python3
3import os
4import platform
5
6def count_max_dir_level():
7 # 目标目录(可根据需要修改)
8 TARGET_DIR = "docs"
9 # 规范化路径(处理不同系统的路径分隔符)
10 TARGET_DIR = os.path.normpath(TARGET_DIR)
11
12 # 检查目录是否存在
13 if not os.path.isdir(TARGET_DIR):
14 print(f"❌ 错误:目录 '{TARGET_DIR}' 不存在!")
15 return
16
17 max_level = 0
18 # 存储所有达到最大层级的目录路径(可能多个)
19 max_level_dirs = []
20
21 # 遍历docs目录树(root=当前目录路径,files=当前目录下的文件列表)
22 for root, _, files in os.walk(TARGET_DIR):
23 # 仅处理包含文件的目录(空目录不统计,与原规则一致)
24 if not files:
25 continue
26
27 # 计算当前目录相对于docs的路径
28 rel_path = os.path.relpath(root, TARGET_DIR)
29 # 计算层级:docs根目录为1级,子目录逐层+1
30 if rel_path == '.':
31 level = 1
32 else:
33 # 兼容Windows(\)和Linux(/)路径分隔符
34 level = len(os.path.normpath(rel_path).split(os.sep)) + 1
35
36 # 更新最大层级和对应目录
37 if level > max_level:
38 max_level = level
39 max_level_dirs = [root] # 重置列表,存入当前目录
40 elif level == max_level:
41 max_level_dirs.append(root) # 新增同层级目录
42
43 # 处理无文件的情况
44 if max_level == 0:
45 print(f"📂 目录 '{TARGET_DIR}' 下未找到任何文件!")
46 return
47
48 # 格式化输出结果
49 print("=" * 50)
50 print(f"📊 docs目录下的最大目录层级:{max_level}")
51 print(f"📍 达到最大层级的目录数量:{len(max_level_dirs)}")
52 print("=" * 50)
53 print("📁 最大层级的目录路径列表:")
54 # 去重(避免os.walk重复遍历的极端情况)+ 按路径排序
55 unique_dirs = sorted(list(set(max_level_dirs)))
56 for idx, dir_path in enumerate(unique_dirs, 1):
57 # 可选:显示绝对路径(注释掉则显示相对路径)
58 # dir_path = os.path.abspath(dir_path)
59 print(f" {idx}. {dir_path} (层级:{max_level})")
60
61if __name__ == "__main__":
62 # 适配Windows终端中文显示
63 if platform.system() == "Windows":
64 import subprocess
65 subprocess.call("", shell=True) # 修复Windows编码问题
66 count_max_dir_level()
亲测效果
解压我提供的docs.zip文件,把解压后的docs目录放到当前脚本所在目录下:
注意:次docs.zip文件含私密md,不允许外部分享。
执行python count_dir_level.py:

问题来了
docs\40.专题\10.运维\130.k8s\30.k8s部署\20.二进制\10.二进制.md
额,上面这个层级深度是到底是6还是7呢?
结论:
目录层级深度是 6。 全路径段数(含文件)是7。
讨论过程:
要确定这个路径的层级深度,核心是回归「目录层级」的计算规则(文件本身不算目录层级,仅统计其所在的目录链),我们一步步拆解:
第一步:明确计算规则(与之前脚本一致)
docs 作为根目录算 1级,每深入一层子目录,层级数+1;文件本身不计入目录层级,仅看它所在的最后一级目录的深度。
第二步:拆分路径(按目录分隔符 \ 拆分)
你的路径:docs\40.专题\10.运维\130.k8s\30.k8s部署\20.二进制\10.二进制.md
| 目录/文件段 | 是否为目录 | 对应层级 |
|---|---|---|
| docs | 是(根目录) | 1 |
| 40.专题 | 是 | 2 |
| 10.运维 | 是 | 3 |
| 130.k8s | 是 | 4 |
| 30.k8s部署 | 是 | 5 |
| 20.二进制 | 是 | 6 |
| 10.二进制.md | 否(文件) | 不计入 |
结论:层级深度是 6(不是7)
- 易错点:如果把文件也当成一段算“段数”,会得到7,但我们统计的是目录层级,文件本身不算,因此最后一级目录「20.二进制」的层级是6。
验证(对应优化后的脚本逻辑)
脚本中计算逻辑:
1# 该文件所在目录路径:docs\40.专题\10.运维\130.k8s\30.k8s部署\20.二进制
2rel_path = "40.专题\\10.运维\\130.k8s\\30.k8s部署\\20.二进制"
3# 分割后目录段数:5 → 层级 = 5 + 1 = 6
4level = len(os.path.normpath(rel_path).split(os.sep)) + 1
脚本会判定该文件所在目录的层级为6,与我们手动计算的结果一致。
补充:如果想按「全路径段数(含文件)」算
若你想把文件也计入“段数”(非目录层级),则段数是7,但这不符合“目录层级”的常规统计逻辑(脚本也不会这么算)。如果需要调整脚本的计算规则(比如按全路径段数算),可以告诉我,我会针对性修改。
结束
推荐使用微信支付

推荐使用支付宝

- 01pip 2025-12-27
- 02pip安装python库报ssl错误 2025-12-27
- 03snowshot 2025-12-27