| name | delete-file |
| description | 安全删除 Obsidian 笔记文件。删除指定文件前自动搜索全库 [[双链]] 引用,清理所有指向该文件的链接,经用户确认后执行删除。触发时机:用户要求删除笔记、清理文件、移除内容时。 |
Skill: delete-file(安全删除 + 反向链接清理)
触发时机
用户要求删除某个笔记文件,或清理不再需要的内容时。
输入
- 目标文件路径(用户指定,或询问后确认)
- 搜索范围(默认全 vault,用户可限定目录)
执行步骤
Step 1: 确认目标文件
- 用户已指定路径 → 直接使用
- 未指定 → 询问:"要删除哪个文件?"
- 确认文件存在且是
.md 文件(Read 验证)
- 记录文件基本信息:路径、大小、最后修改时间
Step 2: 搜索反向链接
使用 Grep 在 vault 中搜索所有指向目标文件的 [[wikilink]]:
搜索模式(目标文件名为 {name},不含 .md):
- 精确链接:
\[\[{name}\]\]
- 别名链接:
\[\[{name}\|.*?\]\]
- 路径链接:
\[\[.*?/{name}\]\]
- 标题锚点:
\[\[{name}#.*?\]\]
执行方式:
Grep pattern="\[\[{name}(\]\]|\||#)" path="{VAULT_PATH}" output_mode="content" -n
搜索范围确认:
- 默认搜索整个 vault
- 若用户限定了范围,只在该目录下搜索(例如
Notes/前端/)
Step 3: 呈现影响分析
汇总并向用户展示:
## 删除影响分析
**目标文件:** `path/to/file.md`
- 大小:X KB
- 最后修改:YYYY-MM-DD
**反向链接:** 在 N 个文件中发现 M 处引用
| # | 引用文件 | 行号 | 引用内容 |
|---|---------|------|---------|
| 1 | Notes/Other.md | L15 | - [[TargetFile]] |
| 2 | Notes/Guide.md | L42 | 详见 [[TargetFile\|说明文档]] |
| ... | ... | ... | ... |
- 若未发现任何反向链接 → 告知用户"未发现指向该文件的链接",仍要求确认后删除
- 若发现大量反向链接(>20 处)→ 摘要显示前 20 条,提供完整列表
Step 4: 用户确认
- 再次呈现影响分析摘要
- 明确询问:"确认删除
{file} 并清理以上所有反向链接?此操作不可撤销。"
- 要求用户回复 "yes" 或 "确认" 才继续
- 用户可选择:
- 确认全部 → 继续 Step 5-6
- 取消 → 停止执行
- 限定范围 → 仅清理指定文件的反向链接
Step 5: 清理反向链接
对每个引用文件,使用 Edit 工具移除指向目标文件的链接:
清理规则:
- 若链接独占一行(如
- [[TargetFile]])→ 删除整行
- 若链接在列表项中且该项只有链接(如
- [[TargetFile]] 说明)→ 删除整行
- 若链接嵌入句子中(如
详见 [[TargetFile]] 了解更多)→ 仅移除 [[TargetFile]],保留周围文字
- 若链接带别名(如
[[TargetFile|文档]])→ 移除整个链接语法,若别名有意义则保留为纯文本
- 移除链接后若产生连续空行 → 合并为单个空行
执行顺序: 按文件逐个处理,每处理完一个文件报告进度。
Step 6: 删除文件
- 默认:直接删除目标文件
- 若用户要求保留备份 → 移动到
{VAULT_PATH}/.trash/{filename}(先创建 .trash/ 目录)
- 确认文件已删除(
ls 验证)
Step 7: 报告结果
## 删除完成
- 已删除:`path/to/file.md`
- 反向链接清理:N 个文件中的 M 处链接已移除
- 无遗留孤立链接
产出
禁止行为
- 不要未经用户确认直接删除文件
- 不要只搜索
[[filename]] 而遗漏别名链接 [[filename|alias]] 和路径链接
- 不要删除文件后遗留孤立的反向链接
- 不要删除非
.md 文件(仅处理 Obsidian 笔记)
- 不要在搜索反向链接前删除文件(先搜索再删除)
- 不要跳过确认步骤,即使反向链接数为 0