markdown笔记文件批量打上时间戳

附件:时间戳重命名程序

需求

给一个文件夹(包含子文件夹)下的所有.md文件重命名,要进行的工作是在最前面添加时间戳。

打上时间戳的笔记能够更好配合笔记管理、[[笔记方法_Zettelkasten (卡片盒笔记法)详解]]、[[知识库管理方法_P.A.R.A. 方法详解]]

例如Typora 笔记迁移 Obsidian 图片链接处理.md修改为20251001-Typora 笔记迁移 Obsidian 图片链接处理

思路

使用 Python 来实现这个批量重命名任务是最高效的方法。

目标分析 (Objective Analysis)

对指定文件夹(及其所有子文件夹)内的全部 .md 文件进行批量重命名,在文件名前添加其创建日期,格式为 YYYYMMDD-

核心逻辑:

  1. 遍历 (Traversal): 递归遍历目标文件夹。
  2. 筛选 (Filtering): 识别出后缀为 .md 的文件。
  3. 检查 (Checking): 判断文件是否已被重命名,避免重复操作。
  4. 读取元数据 (Metadata Reading): 获取文件的修改时间。
  5. 格式化 (Formatting): 将时间转换为 YYYYMMDD 格式的字符串。
  6. 执行重命名 (Renaming): 构建新文件名并执行重命名操作。

创建时间 (ctime on Windows): 当文件或文件夹被复制到新位置时,这个时间戳会更新为复制操作发生的时间。因此,它反映的是副本的创建时间,而不是原始文件的创建时间。

修改时间 (mtime): 这个时间戳记录的是文件内容最后一次被保存更改的时间。它通常在文件复制时保持不变,因此更能代表笔记的“最后编辑日期”。

实践

备份整个目标文件夹,打压缩拷贝该文件夹副本进行操作。

参考目录

|-- 转换
|   |-- rename_md.py
|   `-- 综合软件使用教程 # 目标文件夹
|       |-- Database

安装python,网上教程很多,不再赘述。

  1. 保存脚本: 将下面的代码保存为一个 .py 文件,例如 rename_md.py

  2. 运行脚本: 打开终端或命令行工具,进入你保存脚本的目录,然后运行它:

    python rename_md.py
    

image

  1. 检查结果: 脚本会打印出每一个文件的重命名过程。操作完成后,你可以去文件夹中查看结果。
    image

代码

import os
import sys
import datetime
import re

def batch_rename_md_files(root_folder):
    """
    递归地为指定文件夹及其子文件夹下的所有 .md 文件名添加其“最后修改日期”前缀。
    格式: '笔记.md' -> '20251001-笔记.md'
    """
    print(f"\n开始扫描文件夹: '{root_folder}'")
    renamed_count = 0
    scanned_count = 0

    for dirpath, _, filenames in os.walk(root_folder):
        for filename in filenames:
            if filename.endswith('.md'):
                scanned_count += 1
                
                if re.match(r'^\d{8}-', filename):
                    print(f"-> 跳过 (已是目标格式): {filename}")
                    continue

                old_filepath = os.path.join(dirpath, filename)

                try:
                    # --- 主要修改点 ---
                    # 4. 读取文件的“最后修改日期” (mtime) 而不是“创建日期” (ctime)
                    modification_timestamp = os.path.getmtime(old_filepath)
                    modification_date = datetime.datetime.fromtimestamp(modification_timestamp)
                    # --- 修改结束 ---

                    # 5. 生成 'YYYYMMDD-' 格式的日期前缀
                    date_prefix = modification_date.strftime('%Y%m%d')

                    # 6. 构建新文件名并执行重命名
                    new_filename = f"{date_prefix}-{filename}"
                    new_filepath = os.path.join(dirpath, new_filename)

                    os.rename(old_filepath, new_filepath)
                    print(f"✅ 重命名: '{filename}' -> '{new_filename}'")
                    renamed_count += 1

                except Exception as e:
                    print(f"❌ 处理 '{filename}' 时发生错误: {e}")

    print("\n--- 操作摘要 ---")
    print(f"共扫描到 {scanned_count} 个 .md 文件。")
    print(f"成功重命名 {renamed_count} 个文件。")

# --- 主程序入口 (与上一版相同) ---
if __name__ == "__main__":
    target_folder = input("请输入目标文件夹的绝对路径并按 Enter: ")
    target_folder = target_folder.strip().strip('"')

    if os.path.isdir(target_folder):
        print("-" * 60)
        print(f"目标文件夹: {target_folder}")
        print("将使用文件的【修改日期】进行重命名。")
        print("警告: 文件重命名是不可逆操作,建议在继续前备份您的文件夹。")
        print("-" * 60)
        
        confirm = input("确认要开始处理吗? (y/n): ")
        if confirm.lower() == 'y':
            batch_rename_md_files(target_folder)
            print("\n所有操作已执行完毕。")
        else:
            print("操作已由用户取消。")
    else:
        print(f"错误: 您输入的路径 '{target_folder}' 不是一个有效的文件夹。", file=sys.stderr)

注意事项

  1. 备份: 强烈建议在运行此脚本前,先备份你的整个文件夹。 文件重命名是一个不可逆的操作,以防万一出现非预期的结果。
  2. 文件创建时间 (ctime): os.path.getctime() 的行为在不同操作系统上可能存在差异。在 Windows 上,它通常是文件的创建时间。但在 Unix/Linux 系统上,它可能是文件元数据 (inode) 的最后更改时间。对于大多数个人笔记场景,这个时间是足够准确的。如果需要使用文件的 最后修改时间,只需将 os.path.getctime 更改为 os.path.getmtime 即可。
  3. 幂等性 (Idempotency): 此脚本是幂等的,意味着你可以重复运行它而不会产生副作用。脚本会自动检测已经符合 YYYYMMDD- 格式的文件名并跳过它们,不会重复添加时间戳。
posted @ 2025-10-01 12:48  舟清颺  阅读(201)  评论(0)    收藏  举报