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加书文件本体,整个目录打包走,重装系统直接还原。
六、写在最后
命令行工具最大的价值不是「看起来酷」,而是可重复、可自动化。你花十分钟写一个转换脚本,往后每次进新书都是一条命令跑完,格式、元数据、封面全给你规整好。下次再有人问你「几百本书怎么整理」,直接把这篇甩给他。
有问题评论区聊,咱们下篇见。
