5

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

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)

就像我使用 guava 或类似的流利界面收集工具所做的那样。

您将如何以简洁但仍然可读的方式编写此闭包?

4

1 回答 1

3

目前我能做到的最小的就是使用递归扫描根文件夹的File.traverse方法:

new File( path ).traverse( nameFilter: namePattern ) { f ->
  if( f.filterLine( { it ==~ contentPattern } ) as String ) result << f
}

UsingfilterLine返回一个Writable,我将其转换为 String,然后我们可以利用 Groovy 的真相来查看是否将文件添加到其中result


编辑:

你也可以使用AntBuilder做类似的事情:

def result = new AntBuilder().fileset( dir:'path/to/logs', includes:'**/*.log' ) {
  containsregexp expression:'.*ERROR.*'
}*.file

我更喜欢它一次生成列表,而不是将结果添加到已定义的results列表中。

于 2012-10-18T09:51:45.237 回答