如何使用pandoc处理多个文件?

如何使用pandoc处理多个文件?

文件:

$ ls a.md b.md c.md d.md e.md

命令:pandoc file.md -f markdown file.pdf

我如何同时并行处理两个 pandoc 实例?可能与xargsparallel

它会像这样工作

迭代/命令1/命令2

1 / pandoc a.md -f markdown a.pdf / pandoc b.md -f markdown b.pdf

2 / pandoc c.md -f markdown c.pdf / pandoc d.md -f markdown d.pdf

3 / pandoc e.md -f markdown e.pdf / pandoc f.md -f markdown f.pdf

4 / pandoc g.md -f markdown g.pdf / pandoc h.md -f markdown h.pdf

这些文件是随机命名的。

答案1

这可能有效:

parallel pandoc {} -f markdown {.}.pdf ::: *.md

如果您不想每个 CPU 线程运行一个作业,而是想强制并行运行 2 个作业:

parallel -j2 pandoc {} -f markdown {.}.pdf ::: *.md

您可能需要花 15 分钟阅读《GNU Parallel》一书的第 1+2 章:http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html(打印),https://doi.org/10.5281/zenodo.1146014(在线的)。

答案2

粗略地说,

#!/bin/sh

set -- *.md
while [ $# -gt 0 ]
do
  pandoc "${1} -f markdown -o ${1%.md}.pdf" &
  shift
  if [ $# -gt 0 ]
  then
    pandoc "${1} -f markdown -o ${1%.md}.pdf" &
    shift
  fi
  wait
done

使用 xargs:

find . -type f -name '*.md' -print0 | xargs -0 -n2 -P2 -I{} pandoc {} -f markdown -o {}.pdf

之后您必须重命名它们,因为上面的操作会生成名为 a.md.pdf、b.md.pdf 等的文件。请注意,为了文件名的安全,我们要求find打印以 null 分隔的文件名并询问xargs读取以 null 分隔的输入。将文件重命名为:

for f in ./*.md.pdf; do mv -- "${f}" "${f%.md.pdf}.pdf"; done

相关内容