Groovy - 编写类似闭包的unix grep的更短方法

时间:2012-10-18 09:27:13

标签: groovy closures

我有一个闭包来查找名称与模式匹配且包含给定字符串的所有文件:

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)

正如我将使用番石榴或类似的流畅的界面收集工具。

你是如何以简洁但又可读的方式编写这个闭包的?

1 个答案:

答案 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列表中。