# 巴别图书馆计划（七）：从电子书格式转换切入，掌握 Calibre 命令行

> 本文公开全文。

原文：https://utgd.net/article/20617

Calibre 可谓是电子书管理工具中的格式工厂，任何相关功能，总是有求必应；但其图形界面却并不讨喜，一方面要怪罪其设计语言落后——这无可厚非，毕竟 Calibre 是跨平台工具，而且又没问你要一分钱）；另一方面，则是因为图形界面难以绕开库管理，意即，你需要先把一本书导入（Import）Calibre 库中，才能接着处理，这直接导致 Calibre 书库体积暴涨。即便后续删除，各个角落的残留，也很不干净。而诸如转换格式等常见操作，其实根本不需要经过书库，此时就需要一种独立于图形界面的操作方式。

目光自然而然转换 Calibre 自带的命令行工具（Command Line Tool）。其实，我在其他文章中已经多多少少用到 Calibre 命令行工具，惟缺少一次专门的上手简洁；而此次谈及电子书格式转换，所涉案例真实、实用而通用，又补足了另一款格式转换工具 Pandoc 在 MOBI 和 AZW 等流行格式方面的空白，遂以电子书格式转换为例，浅尝 Calibre 命令行之妙。

## 格式转换命令简介

Calibre 提供了不少命令行工具，例如之前导入书籍时用的 calibredb，而此次使用的则是格式转换工具 ebook\-convert。此命令如傻瓜相机般浅白，标准语法如下：

```
ebook-convert 输入文件路径 输出文件路径 参数
```

就最常见的 EPUB 和 MOBI 两类电子书互相转换而言，甚至都不需要设置参数。而 Calibre 本身容错性又极好，我曾在 UNTAG 会员栏目中提及，即便电子书本身格式有误——例如 HTML 代码没写对——Calibre 也会在格式转换时自动修复，你甚至可以写一个把 EPUB 转换成 EPUB 的小工具，用于修复 Apple Books 等娇贵阅读器打不开的电子书。

只要熟悉上述命令，就能用 Calibre 转换单本电子书：网上常见的 MOBI 格式电子书，可以转换为开放的 EPUB 格式，放心存储于本地，不再忧心于用什么特殊的阅读器；如更喜直接批注 PDF，圈圈画画，也可以将电子书转换为 PDF 文档……如此种种。

## 打包成自动化工具

单条命令或许不难，但实际中，往往需要批量转换电子书；并且转换格式，很可能会成为日常操作。综合考虑，方觉有必要自制自动化工具。所幸我多年以来断断续续维护着一个图片格式转换小工具，种种工程细节已臻完善，故将其稍作改动，换上 Calibre 的命令，即做出一款电子书格式转换工具。下图为 LaunchBar 版的演示，选中书籍（可以多选），运行动作，选择需要转换的格式，即可在原文件边上获得转换好的新书。

如前文所言，Calibre 也可以修复原书，改正一些较为明显的代码笔误，故我也考虑了转换前后格式相同的情况，此时新文件会以 \-2 结尾，现于原文件旁，以免覆盖。动作完全由 Shell 脚本组成，代码附在后面，可以轻松移植；其中 \{"mobi", "epub", "pdf"\} 部分存储了预设导出格式，你可以照着这个格式，继续添加其他常用的输出格式。

```
#!/bin/sh

PATH=$PATH:/usr/local/bin/

echo "$# arguments passed"

read -r -d '' applescriptCode1 <<'EOF'
    tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
    activate
    set formatList to {"mobi", "epub", "pdf"}
    choose from list formatList
    return result
    end tell
EOF

fformat=$(osascript -e "$applescriptCode1")

idx=0

for f in "$@";do
    if [[ "${f##*.}" =~ "$fformat" ]]; then
        ebook-convert "$f" "${f%.*}-2.$fformat"
    else
        ebook-convert "$f" "${f%.*}.$fformat"
    fi
    let idx=$idx+1
done && afplay "/System/Library/Sounds/Submarine.aiff" && osascript -e "tell application \"LaunchBar\" to display in notification center \"Converted $idx ebooks\" with title \"Calibre Convertor\""
```

## 小结

命令行并非是“just another way”，其自有全然不同于图形界面的价值。

命令行或其他代码交互方式之于自动化玩家，如同砂糖之于烘焙：不可或缺。而在 Calibre 的语境下，命令行还有更重要的含义：摆脱复杂——且有点落伍——的图形界面，以及令人不悦的库管理。

---

[前往标准阅读页](https://utgd.net/article/20617?audience=web)
