次のコードは、私の回答から抜粋したものです。プロジェクトファイルを監視すると、ディレクトリを監視して特定のコマンドを実行することもできます。
#!/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 に固執する方がよいでしょう。