0

calibre-convert (ebook-convert) を使用して、電子ブック形式を変換するメイクファイルを作成しようとしています。私が好む形式の順序は、epub > mobi > pdf です。Makefile は、さまざまな形式 (epub、mobi、pdf) の電子ブックを含むフォルダーで実行する必要があります。1 つの eBook は、いくつかの形式でそこに置くことができます。Make は既存のすべての電子ブックを、ブックの既存でないすべてのフォーマットに変換する必要があります (たとえば、ebook には 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 は、ファイル拡張子を解析して、ソースとターゲットの形式を検出します。そのため、すべての形式会話のコマンド ラインは同じです。

このメイクファイルにはいくつかの問題があります。

  1. たとえば、不足している epub を mobi から変換し、生成された epub を使用して不足している pdf を生成します。しかし、新しく生成されたものではなく、既存の形式からファイルを変換したいだけです。既存のファイルのみをソースとして使用するように make にアドバイスする可能性はありますか?
  2. 現在のディレクトリのサブフォルダーにある電子ブックを変換したい。しかし、これらのフォルダーの名前にスペースが含まれていると問題が発生します。再帰的に検索して、find コマンドの範囲でこれをテストしました。フォルダー名でスペースをプレースホルダーに置き換えても機能しませんでした。

誰かが gnu make の経験が豊富で、これらの問題を解決してくれることを願っています。

前もって感謝します

よろしくお願いします

アクセル

4

0 に答える 0