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
}

を使用すると、文字列に変換するWritablefilterLineが返されます。これにより、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 に答える