文件:
$ ls a.md b.md c.md d.md e.md
命令:pandoc file.md -f markdown file.pdf
我如何同时并行处理两个 pandoc 实例?可能与xargs
或parallel
。
它会像这样工作
迭代/命令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