如何通过文件名导出多个markdown文件?

通过检索,我可以获得多个需要的markdown文件的文件名,如何通过这些文件名将相应的markdown文件批量导出到一个文件夹中?

这也许大致等价于, 怎么从整个仓库里 “提取 / 收集 / 删减” 部分笔记, 做成 “partial / 精选集”

从简单到复杂有多个办法

A 如果已经拿到了 MOC 且文件数量不大, 可能挨个复制了就完了, 最省心

懒点的复制办法还有, 既然都拿到了文件名, 就顺手编辑为 "note name 1.md" OR "note name 2.md" OR "note name 3" ... 然后直接丢进 Everything 把搜索结果贴到新目录就完了 (Everything 要临时开一下 “选项 → 搜索 → 支持操作符 AND OR NOT”)


B 借助任意脚本或 dataview 之类, 比如利用 dataview 收集 “源头笔记全部一跳可达的链接”, 输出一段命令行, 其形式如 cp (xcopy) 原始文件绝对路径 目标文件夹 然后手动运行一下

如果动用脚本了, 那自有更多更舒服的办法
也许都不必导出命令行, 直接点按钮就把文件复制妥了


C 要反复做这事, 可以借助 Ob 插件或关联工具

这部分可能出于两个动机

  1. 可能不止收集笔记, 也要收集附件
  2. 可能不止要收集 markdown, 还要顺带导出发布到其他格式

以下是几个可选的工具 (未必 100% 满足具体需求, 得试试)

Obsidian markdown export
将 Markdown 导出到 package(包括图片)
bingryan/obsidian-markdown-export-plugin

Rust obsidian-export
Ob 仓库导出为常规 markdown 语法, 可选部分仓库导出
zoni/obsidian-export

此外, 一些静态网站发布工具也带有这个自动跟踪关联笔记, 自动去除无关附件的功能 (但它们是直接生成目标格式, 未必还能保留 md)

1 个赞

脚本方式

shell

#!/bin/bash

# 目标基础目录,确保这个目录存在
TARGET_BASE_DIR="/path/to/your/target/directory"

# 源文件路径列表
source_files=(
    "分类.md"
    "panels/分类.md"
    "panels/分类和归档.md"
)

# 遍历源文件列表
for src_path in "${source_files[@]}"; do
    # 计算目标路径,通过替换源路径的起始部分为目标基础目录
    target_path="${TARGET_BASE_DIR}/${src_path}"
    
    # 获取目标目录(去除文件名)
    target_dir=$(dirname "$target_path")
    
    # 检查目标目录是否存在,如果不存在则创建
    if [ ! -d "$target_dir" ]; then
        mkdir -p "$target_dir"
    fi
    
    # 执行复制操作
    cp "$src_path" "$target_path"
done

echo "文件复制完成。"

bat

@echo off
REM 目标基础目录,请确保这个目录存在
set TARGET_BASE_DIR=C:\path\to\your\target\directory

REM 源文件路径列表
 set "source_files="
(
    分类.md 
    panels\分类.md 
    panels\分类和归档.md
)"

REM 遍历源文件列表,使用for循环处理每个文件
for %%i in (%source_files%) do (
    REM 计算目标路径,通过替换源路径的起始部分为目标基础目录
    set "target_path=%TARGET_BASE_DIR%\%%i"
    
    REM 获取目标目录(去除文件名)
    set "target_dir=%target_path%"
    for /f "delims=\ tokens=1*" %%a in ("%target_dir%") do set "target_dir=%%b"
    
    REM 检查目标目录是否存在,如果不存在则创建
    if not exist "%target_dir%" (
        mkdir "%target_dir%"
    )
    
    REM 执行复制操作
    copy "%%i" "%target_path%" >nul
)

echo 文件复制完成。

如果不需要动态创建目录 把mkdir部分代码注释掉即可

$src_path 是vault的根目录,如果你的脚本不在根目录执行,可以先cd 到根目录,或者在复制时给 $src_path 加前缀,比如 cp "/data/yourpath/$src_path" "$target_path"copy "c:\data\youpath\%%i" "%target_path%" >nul

注意:以上脚本由AI生成,请自行测试后谨慎使用,后果自负。