计算目录层级深度

最后更新于:

计算目录层级深度

目录

[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()

核心优化点

  1. 记录最大层级目录
    • 用列表 max_level_dirs 存储所有达到最大层级的目录(支持多个目录同层级的场景);
    • 遍历中动态更新:层级更大则重置列表,层级相等则追加目录。
  2. 路径友好处理
    • 自动兼容 Windows(\) 和 Linux/macOS(/) 路径分隔符;
    • 可选显示「相对路径」或「绝对路径」(注释/取消注释对应行即可);
    • 自动去重 + 排序,避免重复路径干扰。
  3. 更友好的输出
    • 增加图标和分隔线,结果更易读;
    • 显示目录数量、每个路径的层级;
    • 处理「docs下无文件」的边界情况,避免报错。
  4. 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.k8s4
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,但这不符合“目录层级”的常规统计逻辑(脚本也不会这么算)。如果需要调整脚本的计算规则(比如按全路径段数算),可以告诉我,我会针对性修改。

结束

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航