再帰的に*.sqlのファイルパスを検索してくれるが、
scalaには見当たらなかったので、書いてみた。
// glob **/*.sql val globSqlFiles = glob((f: File) => !f.isDirectory && f.getName.endsWith(".sql")) _ // curried function def glob(filter: (File) => Boolean)(dirs: List[String]): List[File] = { def recursive(dir: File, acc: List[File]): List[File] = Option(dir.listFiles) match { case None => throw new FileNotFoundException(dir.getAbsolutePath) case Some(lists) => val filtered = lists.filter{ c => filter(c) }.toList val childDirs = lists.filter{ c => c.isDirectory && !c.getName.startsWith(".") } return ( (acc ::: filtered) /: childDirs){ (a, dir) => recursive(dir, a)} } dirs.flatMap{ d => recursive(new File(d), Nil)} } // 使い方。対象ディレクトリはListで複数指定できる。 globSqlFiles(List("/tmp/sql"))
汎用的になるようにカリー化してみた。
3、4行目の条件に正規表現を組み込めば曖昧検索できる。
S-99: Ninety-Nine Scala Problemsを頑張ってやっているせいか、
immutableなListの再帰に対してアレルギーがなくなってきた。
No comments:
Post a Comment