清理 Joplin 中的无用附件(orphaned attachments)

在把图片或其他文件复制到 Joplin 中时,会在 Joplin 内部的存储文件夹中生成一个副本,即附件(attachment)。Joplin 自己提供了一个附件管理器,可以查看和删除附件。然而令人头大的一点是,Joplin 对附件本身并没有提供引用计数或其他追踪方式,即便笔记删除,附件依然会保留。长此以往,Joplin 内部就会存储大量的无用附件(orphaned attachment),不仅占用存储空间,也会增加同步所需的时间。

这一问题在其他笔记工具中也存在。大部分笔记工具提供了一个清理(vacuum)功能,可以手动或自动定期执行,扫描所有笔记,找出没有被笔记关联的附件,并将它们删除。可惜 Joplin 并没有提供这样一个功能,虽然这一问题早就有人在 Github Issues 中提出(orphaned resources don’t get deleted · Issue #932 · laurent22/joplin · GitHub )。

解决这一问题有两种思路。其一是直接检索 Joplin 内的 SQLite 数据库,手动扫描笔记文件并找出没有被使用的附件,再在数据库中手动删除,如 GitHub - patrick-atgithub/joplintool: python script for checking database and sync dir for orphaned files 。这种方式很直观,但是因为数据库是 Joplin 内部实现的一部分,并不是对外暴露的稳定 API,存在一定的风险。其二是 Issue 链接中一位网友的发现,Joplin 在导出笔记本的时候是会进行附件清理的,导出的笔记本文件(JEX)中不存在无用附件。由此可以想到一个方案,那就是首先把笔记导出,然后清空 Joplin 内部所有笔记,最后再重新导入。这一方案的确可行,但是在导出再导入的过程中,可能造成本地和云端的同步状态异常问题,需要强制从本地上载到云端。

受到第二种思路的启发,我自己写了一个小工具,输入是一个 Joplin 导出文件,通过对比 Joplin 的 Web API 得到的完整附件列表和导出文件中清理后的附件列表,得到无用附件列表,再通过 Web API 直接执行删除操作。这一方法的优势是消除了重新导入的过程中可能出现的问题,只需要在本地清理完成后同步一次到云端即可,使用起来也更接近其他工具的 Vacuum 操作。

可以从以下链接找到这个工具(只需要 Python 3.6+):


另外关于 Joplin 同步的碎碎念:之前我用坚果云来进行同步,但是苦于坚果云有同步频率限制,在新设备上首次初始化的时候很容易出问题。后来发现 Joplin 其实还支持 S3 API 作为同步方式。S3 是 AWS 的对象存储服务,因为其出现较早,S3 API 已经成为对象存储 API 的事实标准,大部分提供对象存储的厂商都会提供 S3 兼容 API,如腾讯云、阿里云、七牛云。因为对象存储设计之初就是用来存储小而多的文件的,比 WebDAV 这种以文件系统为内部模型的协议,更接近 Joplin 的需求,且操作频率限制基本也非常高,日常正常使用几乎不会影响。我自己把笔记迁移到了七牛云,价格大概在 0.1 元/月/GB,到现在没有遇到过任何同步问题,极大地改善了 Joplin 的使用体验。

3 个赞

好用,删掉了近两成的无用附件。

开始的时候脑抽,直接在说明页面而不是 raw file 将py文件另存为,结果运行不了 :rofl:

另外,操作顺序是不是应该把 3 放到最前面?

joplin 还有个问题是不知道为啥抓取的图片附件没有后缀名,虽然在 joplin 和其他 markdown 软件里面正常预览,不过单独作为附件好像是没法看的

1 个赞

Joplin的资源目录下的.resource文件夹里的所有附件都是无后缀的。记得看过官方文档或论坛,是说为了便于Joplin建立附件索引、管理附件,因为有“笔记编辑历史”这么个功能。

而我在实践多客户端备份的时候,不知道为何还出现一个resource文件夹,这里面的附件是带有后缀的,这个文件夹不在Joplin的资源目录中。

谢谢,我或许也会再去试试S3。

也想分享一下我用Joplin多平台同步受过的苦。我是期望把它当作网摘用的,因为有官方、第三方的浏览器Webclip插件支持。所以需要同步的内容包括.md文件及大量的图片附件。我最开始用webdav,尝试过坚果云、TeraCloud。坚果云同步限制也碰到了。后来切换为文件系统存储、对文件夹用坚果云同步。

最头疼的问题是,设定2台终端上的笔记同步,操作顺序很影响。我已经忘记了细节,结果无非是导致笔记全部double,或者笔记全部消失。幸好做了备份。一台电脑上初始安装Joplin都会自带几个说明书式的笔记,用户都纠结设置同步前要不要先作删除操作。我大概率是先在A电脑导出全部笔记,B电脑上安装软件后,先导入软件,试图人为让两者一致,然后设置同步,导致了double。官方FAQ我应该是找过的,关于设置多终端同步描述得不是很清楚。入门Joplin的朋友要做足功课,找一找最佳实践,做好备份。

再一个头疼的问题,就是附件的同步。webdav方面,没有找到性能满足、完全托管、经济的服务,作罢。基于本地文件系统、对文件夹进行同步的方式,反正也没有很顺,出现莫名其妙的.resource文件夹、resource文件夹,并不在同一个目录。懒得折腾,遂完全放弃了。

1 个赞

有道理,已经调整,多谢反馈!

webdav / 文件系统同步的坑我也都踩过,基本上的经历和你一致。迁移到 S3 API 之后个人体验就好了很多,基本上没有遇到过同步问题,除了有一次机房波动导致同步卡了一个小时。关于多设备同步,在加入新设备的时候先设定同步参数,然后直接选择「同步高级选项」- 「用远端覆盖本地」,同时保持其他设备上不要修改,首次同步完成之后所有设备的状态就都一致了。
其实用 S3 API 对我来说,除了体验上更好,更重要的是感觉更安心了。WebDAV 网盘虽然也有好几家商业的,但是月费没那么便宜。对象存储则更类似于互联网基础设施,按用量付费,随用随买,价格也不贵,算是花钱买个安心了。

1 个赞

webdav 作为同步协议的话 没有版本管理,如果考虑文件安全 甚至是可以用NAS来解决问题,并不用考虑任何云服务提供商 :rofl:
我个人通过群晖的webdav同步了几个软件的数据文件,目前已经稳定运行两年了,服务稳定性足够。

如果有自己的私有云+公网IP的话,所有数据放在自己手上也不错,不过就要自己运维了 :joy:

:rofl:可以对刚电信运营商 也可以花钱买非固定公网,一般来说 跟运维师傅关系好的话 一包烟就可以解决了,有一个自己的文件中枢,比把文件分散在各个云盘上轻松太多。
至于说运维,国内的电力、网络稳定性,基本上一年到头也没几个时间会裂开吧 :rofl: 群晖、威联通这种成品NAS在文件共享同步方面 不涉及多少运维操作的 :rofl:连上NAS就好了,它会解决一切的。

请问现在的版本有更好的方法来解决无用附件的方法吗?

根据 Issues 中的描述,现在在同步的时候会忽略无用的附件,但是在本地依然会保留。之后应该会加入一个本地自动删除未同步附件的功能,但是目前还没有加入。

Since a few versions, the resources are being indexed just before sync, which should partially solve the problem.

src: orphaned resources don’t get deleted · Issue #932 · laurent22/joplin · GitHub

1 个赞

今天在搜的时候,找到了这个 joplin for vs code 开发者的网站,发现有网页清理的工具,方便后面有这个需求的人。
https://joplin-utils.rxliuli.com/joplin-batch-web/#start

这个是中文网页

https://joplin-utils.rxliuli.com/zh/tools/