软件

Obsidian Dataview代码片段 —— 实用代码

波比AI · 5月2日 · 2025年本文共3563个字 · 预计阅读12分钟8次已读

一、查文件夹所有文件

说明: 实现通过 dataview 查询指定文件夹下的所有文件

使用方法:

  1. 复制以下代码,在任意md文件中插入即可。

  2. 注意修改文件路径为自己库中的路径,否则会报错

[!success] 添加dataview查询的方法

  1. 用代码块包裹查询代码(第一行注明语言 dataview和最后一行对应结尾)
  2. 任意位置插入即可,注意修改文件路径和查询条件

代码 代码框右下有复制按钮,点击自动复制代码


“`dataview
list
from "文件夹名称"
sort file.ctime desc
“`

二、查询所有类型的文件

说明: 实现通过 dataview 查询指定文件夹下,所有类型的文件。对dataview的插件进行补足

使用方法:

  1. 复制以下代码,在任意md文件中插入即可。

  2. 注意修改文件路径为自己库中的路径,否则会报错

[!success] 添加dataview查询的方laoxiongb2c

  1. 用代码块包裹查询代码(第一行注明语言dataview和最后一行对应结尾)
  2. 任意位置插入即可,注意修改文件路径和查询条件

1. 查询任意文件类型(以PDF文件为例)


“`dataviewjs
// 定义要输出的字符串
let str = "";

// 指定要查询的文件类型
let fileType = '.pdf';

// 获取 vault 中的所有文件
let files = this.app.vault.getAllLoadedFiles("");

// 遍历所有文件,判断是否是 PDF,把 PDF 文件链接拼接进字符串
files.forEach(file => {
if (file.path.endsWith(fileType)) {
str = str + "- [[" + file.name + "]]" + "\n";
}
});

// 输出字符串
dv.paragraph(str);
“`

2. 查询指定文件夹下的任意文件类型(以 assets 文件夹下的 PDF 文件为例)


“`dataviewjs
// 定义要输出的字符串
let str = "";

// 获取 vault 中的所有文件
let files = this.app.vault.getAllLoadedFiles();

// 指定要查询的文件夹路径
let folderPath = 'assets';

// 指定要查询的文件类型
let fileType = '.jpg';

// 遍历所有文件,将 PDF 文件链接拼接进字符串
files.forEach(file => {
if (file.path.startsWith(folderPath) && file.path.endsWith(fileType)) {
str = str + "- [[" + file.name + "]]\n";
}
});

// 输出字符串

dv.paragraph(str);
“`

三、查指定标签的文件

说明: 实现通过 dataview 查询指定标签的文件,一个多多个标签

使用方法:

  1. 复制以下代码,在任意md文件中插入即可。

  2. 注意修改文件路径为自己库中的路径,否则会报错

[!success] 添加dataview查询的方法

  1. 用代码块包裹查询代码(第一行注明语言 dataview和最后一行对应结尾)
  2. 任意位置插入即可,注意修改文件路径和查询条件

代码 代码框右下有复制按钮,点击自动复制代码

# 查询指定标签名
list
from “文件夹名称” and #标签名
sort file.ctime desc

# 同时包括多个标签名
list
from “文件夹名称” and #标签名 and #标签名2
sort file.ctime desc

# 任意一个标签名
list
from #标签名 or #标签名2
sort file.ctime desc

# 排除标签名
list
from – #标签名
sort file.ctime desc

四、限定标签-显示关键词所在行

说明: 实现通过 dataview 查询指定文件夹下,指定标签下的所有文件,并显示指定关键字所在行,汇总数据

使用方法:

  1. 复制以下代码,在任意md文件中插入即可。

  2. 注意修改文件路径为自己库中的路径,否则会报错

[!success] 添加dataview查询的方法

  1. 用代码块包裹查询代码(第一行注明语言 dataview和最后一行对应结尾)
  2. 任意位置插入即可,注意修改文件路径和查询条件
  3. 注意此代码中需要修改几个地方
    1. file.path.includes(“123”),其中的文件夹路径123
    2. const tag = “#tag1″,其中的文件标签名称tag1
    3. line.includes(“#tag2”),其中的行内标签名称tag2,这里也可以修改为指定的关键字修改#tag2


“`dataviewjs
// 整个代码是先筛选符合标签的笔记,再筛选笔记中的行内容是否具有标签,然后将文件名和行显示在表中。
// 参考用//注释开关指定查询范围
//tag1限定笔记文件,tag2限定行内容

// 获取指定文件夹中的所有md文件,支持二级目录
const files = app.vault.getMarkdownFiles().filter(file => file.path.includes("123"))
// 预设标签1,从而限定笔记文件
const tag = "#tag1"
// 将指定文件夹中,带有标签1的文件筛选出来
const taggedFiles = new Set(files.reduce((acc, file) => {
const tags = app.metadataCache.getFileCache(file).tags
if (tags) {
let filtered = tags.filter(t => t.tag === tag)
if (filtered) {
return […acc, file]
}
}
return acc
}, []))

//创建一个包含文件名和包含所需标记的行的数组
let arr = files.map(async(file) => {
// 读取限定后的文件,并将其所有内容作为字符串获取
const content = await app.vault.cachedRead(file)
//将所有内容转换为行的数组,并提取包含标签“#tag2”的行
let lines = await content.split("\n").filtelaoxiongb2cr(line => line.includes("#tag2"))
// 删除行中的标记和前置空格,以便于在表中显示。其中“-”是为了删除行中的“-”,“#tag2”是为了删除行中的“#DEF”,“ ”是为了删除行中的空格。
for(var i=0; i < lines.length; i++) {
lines[i] = lines[i].replace(/- /g, '');
lines[i] = lines[i].replace(/ /g, '');
lines[i] = lines[i].replace("#tag2", '');
}
//删除被上步骤替换后形成的空行
console.log(lines)
// 返回包含标记的行的文件名和行的数组
return ["[["+file.name.split(".")[0]+"]]", lines]
})

//解析promises并构建表
Promise.all(arr).then(values => {
consolbobyaie.log(values)
// 过滤掉没有“#tag2”的行
const exists = values.filter(value => value[1][0])
//构建表,显示文件名和行
dv.table(["File", "Lines"], exists)
})

<pre><code class="line-numbers">## 五、包含指定标签或文件包含指定字符的文件

“`yaml
​ // 获取当前文档名称
let fileName = dv.current().file.name;

// 设置搜索条件
let searchTerm = “宝塔”;
let targetTag = “#Wordpress”;

// 查询文件夹中的所有文件,并根据文件名包含指定字符或标签过滤
let relatedFiles = dv.pages().where(p =>
p.file.name.includes(searchTerm) ||
(p.tags && p.tags.includes(targetTag))
);

// 生成 [[link]] 格式的链接
let links = relatedFiles.map(page => `[[${page.file.name}]]`);

// 显示相关文件的链接,以列表形式展示
dv.list(links);

[Total: 0 Average: 0]
0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!