问题
Logseq 目前删除 block 并不会删除引用的文件(图片),日积月累 assets 文件夹里无效附件非常多
解决
目前搜索到的有效方案是 Frederic 写的一段 pyphon 代码 ,但这段代码在涉及中文文件时会报错 UnicodeDecodeError: 'gbk' codec can't decode byte ... illegal multibyte sequence
解决办法是将代码中的 open(os.path.join(dirname, filename))
修改为 open(os.path.join(dirname, filename),encoding="UTF-8")
代码
import os
import shutil
assets_dir = './assets'
journal_dir = './journals'
pages_dir = './pages'
to_delete_dir = './to_delete'
if not os.path.exists(to_delete_dir):
os.makedirs(to_delete_dir)
assets_files = os.listdir(assets_dir)
referenced_files = []
for dirname in [journal_dir, pages_dir]:
for filename in os.listdir(dirname):
if filename.endswith('.md'):
# 打开 .md 文件
with open(os.path.join(dirname, filename),encoding="UTF-8") as f:
# 遍历文件中的每一行
for line in f:
# 遍历 assets 目录中的所有文件
for asset in assets_files:
# 如果这一行包含了 assets 目录中的某个文件的名称,则将这个文件的名称加入到 referenced_files 列表中
if asset in line:
referenced_files.append(asset)
for asset in assets_files:
if asset not in referenced_files and not asset.endswith(".edn"):
print(asset)
shutil.move(os.path.join(assets_dir, asset), to_delete_dir)
(安装 python3 环境后,将代码抱保存为 check_asset_reference.py 复制到 logseq 需整理图谱的根文件夹中,使用 cmd 在当前文件夹运行 python3 check_asset_reference.py
即可将无效附件移动至自动建立的 to_delete 文件夹中)
(代码默认处理 journal_dir 和 pages_dir 中文本涉及的 assets_dir 中的文件,可以结合实际情况修改)
其他
注意上述代码中的 encoding="UTF-8"
若是改为 encoding="gb18030"
代码会正常运行但会误删文件
有相关的插件 logseq-plugin-file-manager,但据说会误删文件未修正。
有相关的删除未使用图片代码 qbosen/backup_unref_images.sh,但只清理图片并不能解决无效附件问题
如果是从 Evernote 等其他笔记软件迁移至 Logseq 等情况,会出现其他附件库(如 cloudlet.info),需要先改代码清理 cloudlet.ino 文件夹,之后将 cloudlet.info 文件夹内剩余有效附件剪切至 assets ,再使用 Visual Studio Code 之类软件批量替换相关 journal 和 page 中的路径代码