我尝试创建一个生成文件,它在 calibre-convert (ebook-convert) 的帮助下转换电子书格式。我首选的格式顺序是 epub > mobi > pdf。makefile 应在包含不同格式(epub、mobi、pdf)的电子书的文件夹中执行。一本电子书可以有多种格式。Make 应该将所有现有的电子书转换为所有不存在的书籍格式(例如,电子书具有 epub 和 pdf 格式 - make 应该创建缺少的 mobi 变体)。用于对话的源格式由首选格式顺序设置。我设法创建了一个生成文件,它可以转换所有丢失的格式。见下文。
SOURCES:=$(shell find . -type f -iname "*.epub" -or -iname "*.mobi" -or -iname "*.pdf" 2>/dev/null | sed 's/ /\*/g')
TARGETS_EPUB:=$(SOURCES:%.mobi=%.epub) $(SOURCES:%.pdf=%.epub)
TARGETS_MOBI:=$(SOURCES:%.epub=%.mobi) $(SOURCES:%.pdf=%.mobi)
TARGETS_PDF:=$(SOURCES:%.epub=%.pdf) $(SOURCES:%.mobi=%.pdf)
%.epub: %.mobi
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
%.epub: %.pdf
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
%.mobi: %.epub
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
%.mobi: %.pdf
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
%.pdf: %.epub
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
%.pdf: %.mobi
ebook-convert '$(subst *, ,$^)' '$(subst *, ,$@)'
all: epub mobi pdf
epub: ${TARGETS_EPUB}
mobi: ${TARGETS_MOBI}
pdf: ${TARGETS_PDF}
该 makefile 读取当前目录的所有 epub、mobi 和 pdf 文件。然后它用 * 占位符替换文件名中的空格(因为 make 数组是空格分隔的)。目标设置了 make 应该如何转换格式以及以什么顺序。
如何将一种格式转换为另一种格式的命令设置在目标变量下方。ebook-convert 通过解析文件扩展名来检测源格式和目标格式。因此,每个格式对话的命令行都是相同的。
使用这个makefile我有一些问题:
- 例如,它将丢失的 epub 从 mobi 中转换出来,然后使用生成的 epub 来生成丢失的 pdf。但我只想从仍然存在的格式转换文件,而不是从新生成的格式转换文件。也许有可能建议 make 只使用现有文件作为源?
- 我想转换当前目录的子文件夹中的电子书。但是如果这些文件夹的名称中有空格,我会遇到问题。我通过递归搜索对 find 命令的范围进行了测试。用占位符替换空格在文件夹名称中不起作用。
我希望有人有很好的 gnu make 经验,可以帮助我解决这些问题。
提前致谢
此致
阿克塞尔