我想将以下批处理脚本更改为 Scala(只是为了好玩),但是,脚本必须继续运行并监听 *.mkd 文件的更改。如果任何文件发生更改,则脚本应重新生成受影响的文档。文件 IO 一直是我的致命弱点...
#!/bin/sh
for file in *.mkd
do
pandoc --number-sections $file -o "${file%%.*}.pdf"
done
Run Code Online (Sandbox Code Playgroud)
任何围绕这一好方法的想法将不胜感激。
小智 5
以下代码取自我的回答:Watch for project files 也可以观察目录并执行特定命令:
#!/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)
Run Code Online (Sandbox Code Playgroud)
用法:
watchr.scala markdownFolder/ "echo \"Something changed!\""
Run Code Online (Sandbox Code Playgroud)
必须对脚本进行扩展才能将文件名注入到命令中。到目前为止,这个片段应该被视为实际答案的构建块。
修改脚本以合并 *.mkd 通配符非常重要,因为您必须手动搜索文件并在所有文件上注册监视。重新使用上面的脚本并将所有文件放在一个目录中具有在创建新文件时拾取新文件的额外优势。
正如您所看到的,仅依靠 Scala 和 Java API,它就会变得非常庞大和混乱,您最好依靠替代库或在使用 INotify 时坚持使用 bash。
| 归档时间: |
|
| 查看次数: |
3969 次 |
| 最近记录: |