思源笔记修改文档创建时间及问题修复

  • 之前的文档迁移到[[思源笔记]]之后,发现创建时间不对,就想着要把文档的创建时间给修改掉。经过探索之后发现思源笔记中文档的创建时间其实就是它的 ID 的一部分,每一个块的 ID 格式都表示为 20230214005232-s65hfds​ 这种形式。于是我就把前几位表示日期时间的地方直接批量替换掉了。

  • 直到今天偶然发现一个问题,修改过日期的文档,他的子块单独拖出来作为一个子文档时,除了原本的文档,还会多出来一个叫做 untitled​ 的文档,两个文档又指向同一个 ID,导致出现了不少 bug。

  • 经过检查后发现每个文档的 ID 默认和它的文件名应该是一致的,只修改过 ID 而没有同时修改文件名就会出问题。

  • 写个脚本修复一下,处理完重建索引即可。

  • Node.js 处理脚本:

    /**
     * index.ts
     * @file 检测思源笔记哪些文档的ID和文件名不同,自动重命名
     */
    
    import * as fs from "fs";
    import * as path from "path";
    
    const targetPath = path.resolve("D:\\我的文档\\SiYuan\\data");
    
    /**
     * 获取所有的sy文件路径
     * @param filePath 目标路径
     */
    function getAllSyFiles(filePath: string) {
      const allSyFiles = [] as string[];
      fs.readdirSync(filePath).forEach((fileName) => {
        // 获取绝对路径
        const fullPath = path.join(filePath, fileName);
        const stats = fs.statSync(fullPath);
        if (stats.isFile() && fileName.endsWith(".sy")) {
          allSyFiles.push(fullPath);
        } else if (stats.isDirectory()) {
          // 递归
          allSyFiles.push(...getAllSyFiles(fullPath));
        }
      });
      return allSyFiles;
    }
    
    /**
     * 检查文件名和文档ID是否相同
     * @param fullPath 文件所处路径
     */
    function checkDoc(fullPath: string) {
      const file = fs.readFileSync(fullPath);
      // 去掉后缀的文件名
      const fileName = path.basename(fullPath, ".sy");
      const json = JSON.parse(file.toString());
      if (json.ID !== fileName) {
        return { isPass: false, json };
      }
    
      return { isPass: true, json };
    }
    
    (async () => {
      const files = getAllSyFiles(targetPath);
      let fixCount = 0;
      for (let f of files) {
        const { isPass, json } = checkDoc(f);
        if (!isPass) {
          const oldName = path.basename(f);
          const newName = json.ID + ".sy";
          console.log(`需修正,原文件名${oldName},应为${newName}`);
          fs.renameSync(f, f.replace(oldName, newName));
          fixCount++;
        }
      }
      console.log(`处理完成,修正了${fixCount}个文件`);
    })();