我有一个闭包来查找名称与模式匹配且包含给定字符串的所有文件:
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
}
}
}
但我很确定我可以缩短一些东西(嘿,否则我可以使用普通的java :)) 我试图找到一种方法来写这个:
result = new File(path).eachFileRecurse.filter(filePattern).grep(contentPattern)
正如我将使用番石榴或类似的流畅的界面收集工具。
你是如何以简洁但又可读的方式编写这个闭包的?
答案 0 :(得分:3)
目前我能得到的最小的是使用File.traverse
method递归扫描根文件夹:
new File( path ).traverse( nameFilter: namePattern ) { f ->
if( f.filterLine( { it ==~ contentPattern } ) as String ) result << f
}
使用filterLine
返回Writable我将其转换为String,然后我们可以利用Groovy真相来查看是否将文件添加到result
。
您也可以使用AntBuilder
做类似的事情:
def result = new AntBuilder().fileset( dir:'path/to/logs', includes:'**/*.log' ) {
containsregexp expression:'.*ERROR.*'
}*.file
我倾向于选择,因为它一次生成列表,而不是将结果添加到已定义的results
列表中。