使用Mac上的pandoc将文件夹中的所有文件转换为md

时间:2014-09-30 17:09:26

标签: makefile pandoc

我正在尝试将整个目录从html转换为markdown。目录树非常高,因此有两个和三个级别的文件嵌套。

在回答this question时,John MacFarlane建议使用以下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的输出所取代。

(我怀疑these lines的某些内容应该会有所帮助,但如果我尝试自己解决这个问题,我就不会有信心打破这些事情。我很有意思关于GNU make)的文盲。)

2 个答案:

答案 0 :(得分:28)

由于您提到您不介意使用make,您可以尝试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。有关详细说明,请参阅here

答案 1 :(得分:1)

这就是我做到的!

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