文書:
$ ls a.md b.md c.md d.md e.md
注文する:pandoc file.md -f markdown file.pdf
2つの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スレッドごとに1つのジョブを実行せずに、2つのジョブを強制的に並列に実行したい場合:
parallel -j2 pandoc {} -f markdown {.}.pdf ::: *.md
GNU Parallelの本の第1章と第2章を約15分読んでください。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