前情提要:我的HEXO是用obsidian管理的,本地使用FreeFileSync将obsidian中CODE目录里面的所有文件(这个目录里面都是博客)镜像同步到HEXO配置的_posts目录里面。

为了方便按时间排序我的文档,我每次写新博客的时候,都会按序号命名。但是之前将一些大文件夹里面的md文件进行了细分归纳,导致某些文件夹里面的md文件序号不再连续,看起来非常奇怪,自己改肯定不方便,直接写个python脚本来处理一下这种情况吧。

我的md文件是这样命名的

1
序号.文件名.md

在某个文件夹下会出现这种情况,即文件的序号不连续。

1
2
3
1.文件a.md
3.文件b.md
10.文件c.md

我想达成的目标就是让这三个文件按连续的序号重新命名,并添加前导0,就像这样

1
2
3
01.文件a.md
02.文件b.md
03.文件c.md

将需求直接喂给GPT,给出了下面这个脚本,个人测试完全莫得问题,贴出来分享给大家。自己写也不是写不出来,主要就是懒,实在是太懒了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
import re


def rename_md_files(folder_path):
# 获取所有md文件
files = [f for f in os.listdir(folder_path) if f.endswith('.md')]

# 使用正则表达式匹配文件名中的数字
pattern = re.compile(r'^(\d+)\..+\.md$')

# 提取出所有匹配的文件
matched_files = []
for file in files:
match = pattern.match(file)
if match:
matched_files.append((int(match.group(1)), file))

# 按照原始数字顺序排序
matched_files.sort()

# 重新编号
for new_index, (old_index, old_name) in enumerate(matched_files, start=1):
new_name = f"{new_index:02d}.{old_name.split('.', 1)[1]}"
old_path = os.path.join(folder_path, old_name)
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
print(f"Renamed '{old_name}' to '{new_name}'")


def traverse_and_rename(folder_path):
for root, dirs, files in os.walk(folder_path):
rename_md_files(root)
for dir in dirs:
traverse_and_rename(os.path.join(root, dir))


# 使用示例
if __name__ == "__main__":
folder_path = r"path/to/folder" # 替换为你的文件夹路径
traverse_and_rename(folder_path)
print("The End.")

修改脚本最末尾需要处理的文件夹路径,脚本会使用os.walk来遍历这个文件路径下的所有文件,并交付给traverse_and_rename函数进行md文件的处理。在traverse_and_rename函数中,使用了正则来匹配我的原有文件命名方式,再根据原有的序号进行排序,最终按排序的结果重新命名文档。

这里的new_index:02d就是添加前导0的写法,02d代表数字不足两位会添加一个前导0。比如01和02。

运行脚本,会打印出原有名字和命名后的结果,个人感觉效果还是非常不错的。不过还是得提醒一下大家:使用任何脚本操作你的笔记之前,都一定要对先有的数据备份一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
PS E:\GIT\rename_py> python test.py
Renamed '0.设置py环境.md' to '01.设置py环境.md'
Renamed '1.git自动上传脚本.md' to '02.git自动上传脚本.md'
Renamed '3.request的ssl报错.md' to '03.request的ssl报错.md'
Renamed '4.request session的cookie如何导入到aiohttp.md' to '04.request session的cookie如何导入到aiohttp.md'
Renamed '5.生成requeirments.txt文件.md' to '05.生成requeirments.txt文件.md'
Renamed '7.ValueError Sample larger than population or is negative.md' to '06.ValueError Sample larger than population or is negative.md'
Renamed '8.python自动化下载md文件中图片.md' to '07.python自动化下载md文件中图片.md'
Renamed '10.ssl报错证书错误的解决方法.md' to '08.ssl报错证书错误的解决方法.md'
Renamed '11.pip安装使用镜像源.md' to '09.pip安装使用镜像源.md'
Renamed '12.logging设置时间的时区.md' to '10.logging设置时间的时区.md'
Renamed '13.Centos安装python3.10.md' to '11.Centos安装python3.10.md'
Renamed '18.python的异步同步.md' to '12.python的异步同步.md'
Renamed '20.pycharm设置中文字体.md' to '13.pycharm设置中文字体.md'
Renamed '21.pymysql链接错误.md' to '14.pymysql链接错误.md'
Renamed '22.pip安装包时找不到Python.h.md' to '15.pip安装包时找不到Python.h.md'
Renamed '23.调用飞书api获取excel表格中数据.md' to '16.调用飞书api获取excel表格中数据.md'
Renamed '24.元组列表集和的区别.md' to '17.元组列表集和的区别.md'
Renamed '25.API的分类.md' to '18.API的分类.md'
Renamed '26.python分片计算文件md5.md' to '19.python分片计算文件md5.md'
Renamed '27.python文件分片加密和上传.md' to '20.python文件分片加密和上传.md'
Renamed '28.valorant国服和港服文件差距.md' to '21.valorant国服和港服文件差距.md'
Renamed '6.关于阿狸vip画图bug的复盘.md' to '01.关于阿狸vip画图bug的复盘.md'
Renamed '9.白嫖replit部署ticket机器人.md' to '02.白嫖replit部署ticket机器人.md'
Renamed '14.阿狸机器人使用文档.md' to '03.阿狸机器人使用文档.md'
Renamed '15.如何给kook机器人加上翻译功能.md' to '04.如何给kook机器人加上翻译功能.md'
Renamed '16.多文件kook机器人.md' to '05.多文件kook机器人.md'
Renamed '17.kook机器人与爱发电对接.md' to '06.kook机器人与爱发电对接.md'
Renamed '19.linkguard机器人配置个性化撤回消息.md' to '07.linkguard机器人配置个性化撤回消息.md'
Renamed '01.关于阿狸vip画图bug的复盘.md' to '01.关于阿狸vip画图bug的复盘.md'
Renamed '02.白嫖replit部署ticket机器人.md' to '02.白嫖replit部署ticket机器人.md'
Renamed '03.阿狸机器人使用文档.md' to '03.阿狸机器人使用文档.md'
Renamed '04.如何给kook机器人加上翻译功能.md' to '04.如何给kook机器人加上翻译功能.md'
Renamed '05.多文件kook机器人.md' to '05.多文件kook机器人.md'
Renamed '06.kook机器人与爱发电对接.md' to '06.kook机器人与爱发电对接.md'
Renamed '07.linkguard机器人配置个性化撤回消息.md' to '07.linkguard机器人配置个性化撤回消息.md'