思源笔记修改文档创建时间及问题修复
之前的文档迁移到[[思源笔记]]之后,发现创建时间不对,就想着要把文档的创建时间给修改掉。经过探索之后发现思源笔记中文档的创建时间其实就是它的 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}个文件`); })();