5

次のバッチ スクリプトを Scala に変更したいと思いますが (楽しみのため)、スクリプトは実行を続け、*.mkd ファイルへの変更をリッスンする必要があります。いずれかのファイルが変更された場合、スクリプトは影響を受けるドキュメントを再生成する必要があります。File IO は常に私のアキレス腱でした...

#!/bin/sh
for file in *.mkd
do
  pandoc --number-sections $file -o "${file%%.*}.pdf"
done

これに対する適切なアプローチに関するアイデアを歓迎します。

4

1 に答える 1

5

次のコードは、私の回答から抜粋したものです。プロジェクトファイルを監視すると、ディレクトリを監視して特定のコマンドを実行することもできます。

#!/usr/bin/env scala

import java.nio.file._
import scala.collection.JavaConversions._
import scala.sys.process._

val file = Paths.get(args(0))
val cmd = args(1)
val watcher = FileSystems.getDefault.newWatchService

file.register(
  watcher, 
  StandardWatchEventKinds.ENTRY_CREATE,
  StandardWatchEventKinds.ENTRY_MODIFY,
  StandardWatchEventKinds.ENTRY_DELETE
)

def exec = cmd run true

@scala.annotation.tailrec
def watch(proc: Process): Unit = {
  val key = watcher.take
  val events = key.pollEvents

  val newProc = 
    if (!events.isEmpty) {
      proc.destroy()
      exec
    } else proc

  if (key.reset) watch(newProc)
  else println("aborted")
}

watch(exec)

使用法:

watchr.scala markdownFolder/ "echo \"Something changed!\""

ファイル名をコマンドに挿入するには、スクリプトを拡張する必要があります。現時点では、このスニペットは実際の回答のビルディング ブロックと見なす必要があります。

*.mkd ワイルドカードを組み込むようにスクリプトを変更することは、手動でファイルを検索し、それらすべてに監視を登録する必要があるため、簡単ではありません。上記のスクリプトを再利用し、すべてのファイルをディレクトリに配置すると、新しいファイルが作成されたときにそれらを取得できるという利点が追加されます。

ご覧のように、Scala と Java API に依存するだけでかなり大きくて厄介になります。代替ライブラリに依存するか、INotify を使用している間は bash に固執する方がよいでしょう。

于 2013-11-06T11:30:37.230 に答える