[!question]
给 Obsidian 文件夹的文档批量添加属性
在 Obsidian 中批量为文件夹下的文档添加属性(YAML Frontmatter),最推荐的方法是使用 Linter 插件或 Metadata Menu 插件。
如果你追求最高效、最自动化的体验,以下是几种主流方案:
方案一:使用 Linter 插件(最推荐,操作最快)
Linter 不仅仅能格式化文档,它还有一个强大的功能:为所有文件强制添加缺失的属性。
-
在插件市场安装并启用 Linter。
-
进入 Linter 设置 -> YAML 选项卡。
-
找到 YAML Key Order 或类似位置,但最关键的是 "Default values" 相关设置。
-
如果你想批量添加特定属性:
- 在 "YAML Rule settings" 中启用 "Add YAML Key"。
- 输入你想要添加的
Key(键)和Value(值)。
-
批量执行:
- 在 Obsidian 左侧的文件管理器中,右键点击目标文件夹。
- 选择 "Lint folder"。
- 插件会自动遍历该文件夹下的所有
.md文件并写入属性。
方案二:使用 Metadata Menu 插件(适合结构化管理)
如果你希望以后也能方便地管理这些属性,这个插件是首选。
- 安装 Metadata Menu。
- 在设置中开启 "File Class" 功能。
- 创建一个 File Class(例如命名为
Work),定义好你需要的属性。 - 批量应用: 该插件支持通过 API 或在表格视图中批量选中文件并指派特定的 File Class,从而实现属性的统一注入。
方案三:使用 VS Code(如果你熟悉外部编辑器)
这是最硬核但也最灵活的方法,适合处理上千个文件。
-
用 VS Code 打开你的 Obsidian 库文件夹。
-
按下
Ctrl + Shift + F进入全局搜索。 -
点击搜索框左侧的小箭头展开 “替换” 框。
-
使用 正则表达式 替换:
-
查找:
^(匹配文件开头) -
替换为:
YAML
--- 属性名: 属性值 --- -
注意:如果文件已有 YAML,正则匹配会稍微复杂一点,建议仅对完全没有属性的文件使用此招。
-
方案四:使用 Templater 脚本(适合进阶用户)
如果你会一点点 JavaScript,可以写一个简单的 Templater 脚本,遍历文件夹并调用 app.fileManager.processFrontMatter API。这种方式最安全,因为它不会破坏原有的 Markdown 结构。
💡 核心建议
- 操作前务必备份! 批量修改具有不可逆性,建议先复制一份文件夹出来做测试。
- 检查 YAML 格式: 确保属性前后都有
---包裹,且冒号后有一个空格。
你想针对哪种特定的属性(比如日期、标签或状态)进行批量添加?我可以帮你写具体的正则表达式或脚本。
[!question]
针对日期
针对日期属性的批量添加,通常有两种具体场景:一是添加当前日期(创建日期),二是根据文件名中的日期提取并填充到属性中。
以下是针对这两种场景最实用的批量操作方案:
方案一:使用 Linter 插件(最简单、全自动)
如果你希望为文件夹下所有文档统一添加“最后修改日期”或“创建日期”属性,Linter 是不二之选。
-
安装插件:在插件市场搜索并安装 Linter。
-
设置属性规则:
- 进入
Settings->Linter->YAML。 - 找到 Date Modified(修改日期)或 Date Created(创建日期)。
- 启用 (Enable) 对应选项。
- Property Name:填入你想显示的名称(如
date或created)。 - Date Format:推荐使用
YYYY-MM-DD。
- 进入
-
批量执行:
- 在左侧文件列表,右键点击目标文件夹。
- 选择 "Lint folder"。
- 插件会自动为该文件夹下所有没有日期属性的文档添加当前系统的创建/修改时间。
方案二:使用正则替换(适合文件名包含日期的情况)
如果你的文件名类似于 2023-10-27 我的笔记.md,你想把文件名里的日期提取到 YAML 属性中,可以使用 VS Code 或 Obsidian 的 Global Search and Replace 插件。
正则操作步骤(以 VS Code 为例):
-
打开文件夹。
-
Ctrl + Shift + H(全局替换)。 -
开启 正则表达式 模式(图标
.*)。 -
查找:
^([\s\S]*)(匹配整个文件内容)。 -
替换为:
YAML
--- date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE --- $1(注:这是添加当前日期。如果要提取文件名日期,需要更复杂的脚本或专门的插件。)
方案三:使用 Templater 脚本(最灵活、精准)
如果你有一定的脚本基础,可以使用 Templater 编写一个简单的 JavaScript 脚本来处理。它可以读取文件的系统创建时间并写入属性。
脚本示例 (可在 Templater 中运行):
JavaScript
<%*
const files = app.vault.getMarkdownFiles().filter(f => f.path.startsWith("你的文件夹路径"));
for (let file of files) {
await app.fileManager.processFrontMatter(file, (frontmatter) => {
// 如果属性不存在,则添加系统创建日期
if (!frontmatter['date']) {
const birthTime = new Date(file.stat.ctime).toISOString().split('T')[0];
frontmatter['date'] = birthTime;
}
});
}
%>
使用方法:将此代码放入一个模板文件中,在目标文件夹的任意位置插入该模板即可一键完成全文件夹处理。
方案四:使用 Metadata Menu(可视化批量修改)
- 为该文件夹设置一个 File Class。
- 在 File Class 中添加一个
Date类型的字段。 - 打开 Data Explorer 视图,筛选出该文件夹的文件。
- 批量勾选文件,点击 Bulk Edit,统一设置日期。
⚠️ 重要提示:
- 备份!备份!备份! 批量修改 Frontmatter 极易因格式问题导致文档显示异常,操作前请手动复制文件夹备份。
- 检查 YAML 格式:确保日期后没有多余空格,且符合
YYYY-MM-DD标准,否则 Obsidian 的日历插件或 Dataview 可能无法识别。
你目前的文件名里带有日期吗?如果有,我可以为你提供更精确的提取正则表达式。
[!question]
文档中的内容例如 上映日期:2026-02-19,如何批量添加到属性里
既然你的文档正文中已经存在 “上映日期:2026-02-19” 这样的文本,最快捷且不依赖复杂插件的方法是使用 VS Code 的全局正则表达式替换。
这种方法可以直接将正文中的日期“提取”并“移动/复制”到顶部的 YAML 属性区域。
方案一:使用 VS Code 正则替换(推荐,最快)
如果你能用 VS Code 打开你的 Obsidian 库文件夹,这是处理成百上千个文档最稳妥的方式。
-
在 VS Code 中打开你的笔记文件夹。
-
按下
Ctrl + Shift + H打开全局替换。 -
点击搜索框右侧的
.*图标(启用正则表达式)。 -
查找内容:
代码段
^([\s\S]*?)上映日期:(\d{4}-\d{2}-\d{2})([\s\S]*) -
替换内容:
YAML
--- date: $2 --- $1上映日期:$2$3(注:如果你希望移动后删掉正文的日期,只需把替换内容最后的
上映日期:$2去掉即可。) -
点击 全部替换。
方案二:使用 Obsidian 插件 "Templater" (JS 脚本)
如果你不想离开 Obsidian,可以使用 Templater 运行一段简单的脚本,它会自动扫描正文并提取日期填充到属性。
- 安装并启用 Templater 插件。
- 创建一个新笔记,粘贴以下代码:
JavaScript
<%*
const files = app.vault.getMarkdownFiles().filter(f => f.path.startsWith("你的文件夹名称"));
for (const file of files) {
const content = await app.vault.read(file);
// 匹配正则:上映日期:2026-02-19
const match = content.match(/上映日期:(\d{4}-\d{2}-\d{2})/);
if (match) {
const dateValue = match[1];
await app.fileManager.processFrontMatter(file, (fm) => {
fm['release_date'] = dateValue; // 属性名可以自定义
});
}
}
%>
- 在设置中将该文件设为模板,然后在该文件夹下随便找个地方执行这个模板即可。
方案三:使用 "Metadata Extractor" 插件
社区有一个专门的插件叫 Metadata Extractor(或类似的 Regex 提取工具),它可以扫描正文中的特定模式并将其转化为属性。
- 配置提取规则:
上映日期:(?<date>\d{4}-\d{2}-\d{2})。 - 运行提取任务,它会将匹配到的日期批量写入 YAML。
💡 核心技巧与注意事项
- 属性命名建议:建议在 YAML 中使用英文 Key,例如
date:或release_date:,这样更方便之后配合 Dataview 插件进行筛选和排序。 - 备份建议:在执行 VS Code 全局替换前,请务必备份你的文件夹。正则替换一旦写错,可能会导致文档头部乱码。
- 多日期处理:如果一个文档里有多个日期,正则默认会匹配第一个。
你需要我帮你针对“已经有部分 YAML 属性”的文件调整正则表达式吗?(现有的正则如果处理已有 YAML 的文件,可能会导致出现两组 ---)
[!question]
需要
如果你已经有一部分文档包含 YAML 属性(即开头已经有 ---),那么直接使用简单的正则替换会导致文档出现两对 ---(变成两个属性区),这会让 Obsidian 无法识别。
为了处理**“可能已有属性”和“提取正文日期”**这两种复杂情况,以下是两种最稳妥的方案:
方案一:使用 Templater 脚本(最推荐,安全且不破坏格式)
这是最智能的方法,因为它使用 Obsidian 官方的 processFrontMatter API,无论文档有没有属性,它都能正确地插入或更新。
- 安装并启用 Templater。
- 创建一个新笔记,粘贴以下脚本:
JavaScript
<%*
// 1. 设置你要处理的文件夹名称(例如 "电影库")
const folderName = "你的文件夹名字";
const files = app.vault.getMarkdownFiles().filter(f => f.path.startsWith(folderName));
for (const file of files) {
const content = await app.vault.read(file);
// 2. 匹配正文中的日期:上映日期:2026-02-19
const match = content.match(/上映日期[::]\s*(\d{4}-\d{2}-\d{2})/);
if (match) {
const dateValue = match[1];
// 3. 安全地更新 YAML 属性
await app.fileManager.processFrontMatter(file, (fm) => {
// 如果你希望属性名是 'date',就写 fm['date']
fm['上映日期'] = dateValue;
});
console.log(`已处理: ${file.name}`);
}
}
new Notice("批量日期属性添加完成!");
%>
- 运行方式:在编辑器中按下
Alt + E(或点击 Templater 图标),选择运行这个模板。它会自动遍历文件夹,提取日期并精准放入顶部的属性区。
方案二:VS Code 高级正则替换(适合已有 YAML 的情况)
如果你习惯用 VS Code,可以使用下面的逻辑来避免产生双重 ---。我们需要分两种情况处理:
情况 A:针对“已有 YAML 属性”的文件
-
查找:
^---\n([\s\S]*?)\n---\n([\s\S]*?)上映日期:(\d{4}-\d{2}-\d{2}) -
替换为:
YAML
--- $1 上映日期: $3 --- $2上映日期:$3
情况 B:针对“完全没有 YAML”的文件
-
查找:
^(?!---)([\s\S]*?)上映日期:(\d{4}-\d{2}-\d{2}) -
替换为:
YAML
--- 上映日期: $2 --- $1上映日期:$2
方案三:使用 Linter 插件的 "Custom Replace"
如果你不想写代码,Linter 插件其实也支持正则替换:
-
打开 Linter 设置 -> Custom Replace。
-
添加一条规则:
- Regex to find:
上映日期:(\d{4}-\d{2}-\d{2}) - Replacement String:可以配合 Linter 的 YAML 强制添加功能。
- 注意:这种方式配置较繁琐,不如方案一脚本直接。
- Regex to find:
💡 总结建议
首选方案一(脚本)。因为脚本会自动判断文件状态:
- 如果没有属性区,它会自动创建一个。
- 如果已有属性区,它会在现有的列表里增加一行
上映日期: 2026-02-19。 - 如果已有
上映日期这个属性,它会更新它的值。
操作前小贴士:
- 脚本里的
你的文件夹名字必须填准确(区分大小写)。 - 建议先对一个副本文件进行测试,确认无误后再对整个文件夹执行。
用Template测试没有问题!!!
Tag: #Obsidian #Template #Linter #实例
文章评论