web-dev-qa-db-ja.com

pandocで複数のファイルを処理する方法は?

ファイル:

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

コマンド:pandoc file.md -f markdown file.pdf

2つのpandocインスタンスを同時に並行して処理するにはどうすればよいですか?おそらくxargsまたはparallelを使用します。

それは次のように機能します

反復/ cmd 1/cmd 2

1/pandoc a.md-fマークダウンa.pdf/pandoc b.md-fマークダウンb.pdf

2/pandoc c.md-fマークダウンc.pdf/pandoc d.md-fマークダウンd.pdf

3/pandoc e.md-fマークダウンe.pdf/pandoc f.md-fマークダウンf.pdf

4/pandoc g.md-fマークダウンg.pdf/pandoc h.md-fマークダウンh.pdf

ファイルにはランダムな名前が付けられます。

2
Latex_xetaL

粗雑に、

#!/bin/sh

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

Xargsの場合:

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

上記の場合、a.md.pdf、b.md.pdfなどの名前のファイルが作成されるため、後で名前を変更する必要があります。ファイル名を安全に保つために、findに印刷を依頼していることに注意してください。 nullで区切られたファイル名とxargsにnullで区切られた入力を読み込むように要求します。次の名前でファイルの名前を変更します。

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

これはうまくいくかもしれません:

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

CPUスレッドごとに1つのジョブを実行したくないが、2つを並列に強制したい場合:

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

GNU Parallel book: http://www.lulu.com/shop/ole-tange/gnu- parallel-2018/paperback/product-23558902.html (印刷)、 https://doi.org/10.5281/zenodo.1146014 (オンライン)。

2
Ole Tange