我有一个闭包来查找名称与模式匹配并包含给定String的所有文件:
def path = "path/to/logs"
def namePatten = ~/.*.log/
def contentPattern ~/.*ERROR.*/
def result = []
new File(path).eachDirRecurse { File dir ->
dir.eachFileMatch(namePattern) { File f ->
f.eachLine { String l ->
if(l.matches(contentPattern)) {
result.add(f)
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我很确定我可以有更短的东西(嘿,否则我可以使用普通的java :))
我试图找到一种方法来写这个有点像:
result = new File(path).eachFileRecurse.filter(filePattern).grep(contentPattern)
正如我将使用番石榴或类似的流畅的界面收集工具.
你是如何以简洁但仍然可读的方式编写这个闭包的?
目前我能得到的最小方法是使用递归扫描根文件夹的File.traverse方法:
new File( path ).traverse( nameFilter: namePattern ) { f ->
if( f.filterLine( { it ==~ contentPattern } ) as String ) result << f
}
Run Code Online (Sandbox Code Playgroud)
使用filterLine返回一个Writableresult ,我将其转换为 String,然后我们可以利用 Groovy 事实来查看是否添加文件。
您还可以使用AntBuilder做类似的事情:
def result = new AntBuilder().fileset( dir:'path/to/logs', includes:'**/*.log' ) {
containsregexp expression:'.*ERROR.*'
}*.file
Run Code Online (Sandbox Code Playgroud)
我更喜欢它,因为它一次性生成列表,而不是将结果添加到已经定义的results列表中。