Calibre 命令行三件套实战:电子书格式转换、元数据批量整理一条龙

先跟大伙说个结论:如果你手里攒了几百本 EP…

先跟大伙说个结论:如果你手里攒了几百本 EPUB、MOBI、PDF,还在一本一本手动改格式、补作者名、导进阅读器,那这活儿完全可以交给命令行。今天这篇讲 Calibre 的命令行三件套——ebook-convert、calibredb、ebook-meta,一条命令解决格式转换、元数据批量整理、书库管理。全程终端操作,不碰图形界面,特别适合挂在服务器上批量跑。

一、为什么是 Calibre 的命令行

图形版的 Calibre 大家应该都熟,但它有个致命问题:批量操作慢、没法自动化。你要把 200 本 EPUB 转成 MOBI 塞进 Kindle,点鼠标得点到手抽筋。而命令行版没有图形依赖,可以写进脚本、挂进 cron,服务器上一跑就是几百本,半夜没人管它自己就干完了。

先说安装。Debian/Ubuntu 一行搞定:

sudo apt update && sudo apt install -y calibre

装完之后,ebook-convert、calibredb、ebook-meta 这三个命令就直接可用了。注意别跟图形版 Calibre 同时跑同一个书库,会抢数据库锁,这点后面会提到。

二、格式转换:ebook-convert

这是最常用的一个。基本语法就一句话:

ebook-convert 输入文件 输出文件 [选项]

举个最实在的例子,把一本 EPUB 转成 MOBI 给 Kindle 用:

ebook-convert input.epub output.mobi

转换格式由输出文件的后缀名自动判断,所以上面那条就是 EPUB → MOBI。反过来、转 PDF、转 AZW3 都同理。真正好用的是加参数:

ebook-convert input.epub output.mobi \
  --title "三体全集" \
  --authors "刘慈欣" \
  --language zh \
  --change-justification justify \
  --base-font-size 12

这里 --authors 直接把作者信息写进元数据,--base-font-size 调字号,对 Kindle 这种默认字号偏小的设备特别实用。PDF 转 EPUB 是重灾区,建议加上行高和边距参数,否则转出来排版稀烂:

ebook-convert book.pdf book.epub \
  --flow-size 0 \
  --insert-blank-line \
  --line-height 0.8 \
  --margin-top 12 --margin-bottom 12

说句实话,PDF 是版式固定的格式,转 EPUB 天然会丢排版,扫版 PDF 基本救不回来,文字版能转个七八成。这个预期先摆正,别指望一键完美。

三、元数据:ebook-meta 与 calibredb

网上下来的电子书,元数据往往一塌糊涂——作者名是网站名、标题带一堆乱码、封面干脆没有。ebook-meta 直接改单个文件:

ebook-meta book.epub \
  --title "深入理解计算机系统" \
  --authors "Randal E. Bryant" \
  --tags "计算机,操作系统" \
  --comments "CSAPP 中文第三版"

但真正批量整理,得靠 calibredb。它是书库数据库的入口,能查、能改、能导入导出。先建一个书库:

calibredb --with-library /data/books library create

然后把书批量导进去:

calibredb --with-library /data/books add /path/to/books/*.epub

导入后用 list 查看书库,配合 search 过滤:

calibredb --with-library /data/books list --fields title,authors,tags
calibredb --with-library /data/books search "authors:刘慈欣"

批量改元数据是这套流程的灵魂。下面这条把「作者为空」的书统一补成「佚名」,一次改完整个书库:

calibredb --with-library /data/books list --for-machine \
  | python3 -c '
import json, sys, subprocess
for line in sys.stdin:
    b = json.loads(line)
    if not b.get("authors"):
        subprocess.run(["calibredb", "--with-library", "/data/books",
                        "set_metadata", str(b["id"]), "--authors", "佚名"])
'

--for-machine 会输出 JSON,方便脚本逐条处理。这个思路可以延伸到任意字段:批量清空乱码标签、统一出版社、按作者自动分类目录。核心就一句话——凡是能查出来的,就能脚本化批量改。

四、自动抓元数据和封面:fetch-ebook-metadata

手动补元数据再快,也架不住书多。Calibre 还藏着一个 fetch-ebook-metadata,能联网按书名和作者去豆瓣、亚马逊、Google 等源自动匹配信息。基本用法:

fetch-ebook-metadata --title "三体" --authors "刘慈欣"

它会输出候选结果,带上 --isbn 参数匹配最准:

fetch-ebook-metadata --isbn 9787536692930

确认无误后,把结果存成 metadata.opf,再导入书库:

fetch-ebook-metadata --title "三体" --authors "刘慈欣" > /tmp/meta.opf
calibredb --with-library /data/books add book.epub --from-opf /tmp/meta.opf

这样一次就能把作者、简介、标签、封面全带进来。不过要提醒一句:自动匹配的结果不一定干净,尤其豆瓣的书名经常带副标题或丛书名,导入前最好用 ebook-meta 手工核对一遍,别让错误信息批量污染书库。真要重度整理,还是那句老话——先抓取、再人工抽检、最后才批量落地。

五、几个踩坑提醒

  • 别跟图形版抢库:Calibre 的书库用 SQLite,同时开两个进程会锁库报错。命令行操作前先把图形版关掉。
  • 路径别带空格:批处理脚本里文件名有空格要加引号,不然命令会被截断,这是最常见的翻车点。
  • 转换是 CPU 密集活:几百本一起转会占满 CPU,建议用 nice 降优先级,或者拆成小批量跑,别把服务器拖垮。
  • 备份书库目录:metadata.db 加书文件本体,整个目录打包走,重装系统直接还原。

六、写在最后

命令行工具最大的价值不是「看起来酷」,而是可重复、可自动化。你花十分钟写一个转换脚本,往后每次进新书都是一条命令跑完,格式、元数据、封面全给你规整好。下次再有人问你「几百本书怎么整理」,直接把这篇甩给他。

有问题评论区聊,咱们下篇见。

类似文章

发表回复

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