迁移实录

5009 条为知笔记、44499 个图片资源:从 Markdown 导出、75% 图片压缩,到使用官方 YoudaoNote CLI 导入、回滚错误数据和最终云端对账。

5009 条笔记 · 44499 个资源 · 支持断点续传


原始数据有什么

扫描为知笔记本地数据后,得到的核心数字如下:

  • 笔记:5009 条
  • 图片资源:44499 个
  • 原始图片约 4.49 GiB
  • 相当一部分图片是网页剪藏留下的网站图标、按钮、CSS 背景等“网页外壳”
  • 约 1.82 GiB 资源可以通过识别网页外壳、去重和压缩显著缩减

迁移目标有两个:一是生成结构清晰、可长期保存的 Markdown;二是在有道云笔记中新建“为知笔记”根目录,保留原目录作为二级目录。

第一个坑:不能把 Markdown 文本直接塞进富文本笔记

最初的导入方案直接操作有道客户端的本地数据,并把 Markdown 正文写入笔记。结果图片语法被当作普通文本显示:

![](https://note.youdao.com/yws/res/...)

看似“导入成功”,实际完全不可用。直接控制桌面客户端或 Chromium 控制台也不可靠:数据量一大,页面、开发者工具和同步进程都可能崩溃。

最终改用有道官方的 YoudaoNote CLI。纯文字笔记使用原生 save,含本地图片的网页剪藏使用 clip-save,再通过 move 归档到目标目录。这样生成的是有道能够正常查看和编辑的原生笔记,而不是一坨 Markdown 字符串。

图片怎么处理

图片不需要追求无损。迁移时采用 75% 质量,并按格式选择合适的工具或编码器:

  • PNG:pngquant
  • JPEG:mozjpeg
  • GIF:gifsicle,超大动态图转为 WebP
  • WebP:cwebp
  • AVIF:avifenc
  • JPEG XL:cjxl

处理策略不是简单地把所有图片压一遍,而是先清理网页外壳,再压缩正文图片。对于单篇图片总量达到 15–70 MiB 的文章,进一步限制长边尺寸;超大 GIF 转为 75% 质量的动态 WebP。这样肉眼观感变化很小,但请求体积能降到官方接口可接受的范围。

错误导入必须先完整回滚

发现第一次导入不可用后,没有在错误数据上继续打补丁,而是停止有道客户端同步,通过官方 CLI 删除已经到达云端的错误笔记,同时清理本地错误记录。

这次回滚共处理:

  • 云端错误笔记:4350 条
  • 本地错误笔记记录:5009 条
  • 本地错误资源记录:44499 个
  • 删除对应本地文件:49506 个

操作前保留了数据库备份。整个过程使用检查点记录已完成 ID,脚本中断或电脑关机后可以继续,而不会从头删除或重复创建。

“成功 5005 条”,为什么客户端只显示 3528 条

这是后期最隐蔽的问题。

导入脚本曾把“CLI 返回成功并给出 fileId”理解为“笔记已经进入目标文件夹”。逐页读取云端目录并与检查点对账后发现:

  • 2870 条正确笔记确实位于目标二级文件夹
  • 约 2135 条原生笔记虽然创建成功,但没有进入预期目录
  • 目标目录里还残留约 680 条旧 Markdown 或重复记录

根因是 save 命令创建成功后,目录参数并没有按预期生效;同时第一次清理期间仍有少量同步竞态,导致旧记录残留。

修复方案不是按标题猜测,而是完全基于两个检查点中的 fileId:

  1. 将 2089 条原生笔记移动到对应二级目录。
  2. 再次扫描全部二级目录,补充移动 46 条错放笔记。
  3. 只删除与旧错误检查点 ID 精确匹配的 679 条记录。

最终移动 2135 条、删除 679 条,错误为 0。正确归档数量达到 5005 条。

可靠批量迁移需要哪些机制

这次迁移最后稳定下来,依靠的不是某个神奇命令,而是一组朴素的工程措施:

  • 每成功一条就写检查点,而不是整批结束后才保存
  • 所有移动和删除都以 fileId 为准,不依赖标题
  • 官方 CLI 单线程或低并发运行,避免会话互相挤掉
  • 对超时、连接重置和会话失效做有限重试
  • 创建、移动、删除分阶段执行,每阶段都能独立恢复
  • 导入完成后再次分页读取云端,不能只相信接口的“成功”返回
  • 桌面客户端在批处理期间保持关闭,避免本地同步与脚本竞争

给长任务加上通知

迁移持续数小时,中间还经历了关机暂停。为了不用一直盯着终端,我封装了一个通用企业微信通知工具,支持普通消息和节流进度消息。修复阶段每增加 100 个操作或每 5 分钟推送一次,异常退出会自动从检查点重启并通知,完成时强制发送最终结果。

通知工具只从用户级私密配置读取 Webhook,密钥不会写进项目源码和日志。

最终结果

  • Markdown 导出:5009 条,全部保留在本地
  • 有道云笔记正确归档:5005 条
  • 特殊失败:4 条,原文和资源仍在本地 Markdown 目录
  • 目录结构:保留原为知笔记一级分类,迁移后作为“为知笔记”的二级目录
  • 图片:清理网页外壳,正文图片按 75% 质量压缩
  • 修复阶段:移动 2135 条,删除旧错误记录 679 条,0 错误

最大的教训是:批量迁移不能只看接口返回值。真正的“完成”必须同时满足内容能正常阅读、图片能显示、目录位置正确,并且云端逐项对账通过。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注