如何给某个文件夹下的所有文件,指量加上某个页面属性?

这个问题还可以延伸一下,比如用 Dataview 得到一个表格结果以后,如何给表格里所有的页面里新增一个页面属性,甚至指定属性值。

页面属性可能是指文档属性 (Yaml FrontMatter)?

从简到繁有不少办法, 最好理解的方式就是直接把笔记视为纯文本, 往两次 --- 之间写自己的 key: value 就完了

大部分支持 “打开一个文件夹” 的代码编辑器比如 VSCode, 都可以这么搞

这里简单假设, 已经事先确认了笔记里必然有仅有一次 key: value
那就替换 key: value => key: value\nkey2: value2 (其中 key2: value2 表示需要新增加的属性)

复杂点可以使用正则, (\s*---(.|\n)+?\n)(---\n) 会匹配笔记里最先出现的两次 ---, 然后若想往第二个 --- 前面, 增加自己指定的属性, 那替换为 $1key2: value2\n$3 就可以了

无论如何一定先做小规模实验, 且事先备份, 否则元数据搞乱了很麻烦


复杂点的方式利用 Ob 自带的 app.fileManager.processFrontMatter

建议在控制台执行, 不建议在 dv 块执行 (因为 dv 块很容易就触发执行了, 次数也不好控制, 除非弄个界面点击触发)

简单样例如下, 先弄到目标 notePathList, 再对每个文档添加属性

// notePathList 需要自己以任意手段收集 (dv 可以很轻松的干这个活儿)
// 当 query 条件复杂时, 最好还是人工扫一眼这个名单, 

const notePathList = [
	"path/to/note1.md",
	"path/to/note2.md",
	"path/to/note3.md"
]

notePathList.forEach(notePath => {
	const fileObj = app.vault.getAbstractFileByPath(notePath);
	app.fileManager.processFrontMatter(fileObj, fm => { 
		fm["mytestkey"] = "mytestvalue";   // 这里替换为需要修改的属性, 可以设为动态属性
		new Notice(`set ${fileObj.path} YFM ${"mytestkey"} => ${"mytestvalue"}`);
	})
})

以上 app.fileManager.processFrontMatter 的好处是, 可以应对以下局面:

  • 有些笔记已经有 YFM, 有些完全没写过 YFM
  • 笔记 YFM 中, 有些需要添加 key, 有些是有了 key, 只需修改 value, 且希望保留原 key 的位置
  • 每个笔记新增的 key: value 是不固定的, 需要动态生成

其他的方式, 似乎有不少插件做了类似的事, 比如各种提及 db 关键词的插件
此外还有个 mdelobelle/metadatamenu 这个特点是还能处理行内属性 (即 dv 风格的 [key:: value] 属性) 但是这插件我不太会用, 感觉有些功能没试出来