web-dev-qa-db-ja.com

Macでpandocを使用して、フォルダ内のすべてのファイルをmdに変換する

ディレクトリ全体をhtmlからマークダウンに変換しようとしています。ディレクトリツリーは非常に高いため、2レベルと3レベル下にネストされたファイルがあります。

この質問 に答える際に、JohnMacFarlaneは次のMakefileを使用することを提案しました。

TXTDIR=sources
HTMLS=$(wildcard *.html)
MDS=$(patsubst %.html,$(TXTDIR)/%.markdown, $(HTMLS))

.PHONY : all

all : $(MDS)

$(TXTDIR) :
    mkdir $(TXTDIR)

$(TXTDIR)/%.markdown : %.html $(TXTDIR)
    pandoc -f html -t markdown -s $< -o $@

さて、これはサブディレクトリ内には入らないようです。ツリー全体を処理するようにこれを変更する簡単な方法はありますか?

これをmakeに入れる必要はありません。私が探しているのは、各htmlファイルがそのファイルで実行中のpandocの出力に置き換えられる初期ディレクトリのミラーを取得する方法です。

(私は これらの行 に沿って何かが役立つと思いますが、私が自分でそれをやろうとしても物事を壊さないという自信はありません。私はそれに関しては文盲です。 GNU make)。)

19
apc

makeを使用してもかまわないnotとおっしゃっていたので、bashを試すことができます。

私はこれからコードを変更しました answer 、親ディレクトリで使用します:

find ./ -iname "*.md" -type f -exec sh -c 'pandoc "${0}" -o "${0%.md}.pdf"' {} \;

私がテストしたときに機能したので、あなたのために機能するはずです。

リクエストに応じて出力フォルダを指定する方法はありますか?(元のファイルとしてhtmlを使用し、md出力として):

find ./ -iname "*.html" -type f -exec sh -c 'pandoc "${0}" -o "./output/$(basename ${0%.html}.md)"' {} \;

私はこれをテストしました、そしてそれは私のために働きます。

編集:コメントによると、findおよび{} \;オプションと一緒に使用すると-execが使用されます多かれ少なかれ、ファイル名があるべき場所のプレースホルダーとして。そのように、コマンドに配置されていることがわかったファイル名を展開します。 \;-execを終了します。詳細については、 ここ を参照してください。

30

これが私がやった方法です!

files=($(find ${INPUT_FOLDER} -type f -name '*.md'))
for item in ${files[*]}
do
  printf "   %s\n" $item
  install -d ${DIR}/build/$item
  pandoc $item -f markdown -t html -o ${DIR}/build/$item.html;
  rm -Rf ${DIR}/build/$item
done
1
Pilk