Groovy读取目录中的最新文件

时间:2010-11-11 22:43:38

标签: file groovy directory

我刚才有一个关于编写一个函数的问题,该函数将在目录中搜索目录中的最新日志。我目前想出了一个,但我想知道是否有更好的(也许更合适的)这样做。

我目前正在使用hdsentinel在计算机上创建日志并将日志放在目录中。日志保存如下:

/directory/hdsentinel-computername-date

ie. C:/hdsentinel-owner-2010-11-11.txt

所以我编写了一个快速脚本,循环访问某些变量以检查最近的(在过去一周内),但在查看之后,我会质疑以这种方式做事的效率和适当程度。

这是脚本:

String directoryPath = "D:"
def computerName = InetAddress.getLocalHost().hostName
def dateToday = new Date()
def dateToString = String.format('%tm-%<td-%<tY', dateToday)
def fileExtension = ".txt"
def theFile


for(int i = 0; i < 7; i++) {
    dateToString = String.format('%tY-%<tm-%<td', dateToday.minus(i))
    fileName = "$directoryPath\\hdsentinel-$computerName-$dateToString$fileExtension"

    theFile = new File(fileName)

    if(theFile.exists()) {
        println fileName
        break;
    } else {
        println "Couldn't find the file: " + fileName
    }
}

theFile.eachLine { print it }

脚本运行正常,也许它有一些缺陷。在我继续之前,我觉得我应该继续问一下这类事情的典型路线。

赞赏所有输入。

3 个答案:

答案 0 :(得分:5)

虽然有点乱,但你可以通过'groupBy'方法实现多列排序(对Aaron代码的阐述)..

def today = new Date()
def recent = {file -> today - new Date(file.lastModified()) < 7}

new File('/yourDirectory/').listFiles().toList()
.findAll(recent)
.groupBy{it.name.split('-')[1]}
.collect{owner, logs -> logs.sort{a,b -> a.lastModified() <=> b.lastModified()} }
.flatten()
.each{ println "${new Date(it.lastModified())}  ${it.name}" } 

查找上周创建的所有日志,按所有者名称对其进行分组,然后根据修改日期进行排序。

如果目录中有日志以外的文件,您可能首先需要grep查找包含'hdsentinel'的文件。

我希望这会有所帮助。

修改 从您提供的示例中,我无法确定格式中最低有效数字是否为

  

C:/hdsentinel-owner-2010-11-11.txt

表示月份或日期。如果是后者,按文件名排序将自动按所有者划分优先级,然后按创建日期排序(不包含上述代码的所有诡计)。

对于实例:

new File('/directory').listFiles().toList().findAll(recent).sort{it.name}

答案 1 :(得分:3)

希望这对一些人有所帮助。这样可以按照修改后的方式修改给定的路径。将它们列出来。

您可以限制列表,并在闭包中添加其他条件以获得所需的结果

 new File('/').listFiles().sort() {
   a,b -> a.lastModified().compareTo b.lastModified()
 }.each {
     println  it.lastModified() + "  " + it.name
 } 

答案 2 :(得分:1)

当我试图解决类似的问题时,学会了一种更清洁的方法。

定义用于排序的闭包

def fileSortCondition = { it.lastModified() }

File.listFiles()有其他变体,它接受Java中的FileFilter和FilenameFilter,这些接口有一个名为accept的方法,将接口实现为闭包。

def fileNameFilter = { dir, filename ->
if(filename.matches(regrx))
    return true
else
    return false
} as FilenameFilter

最后

new File("C:\\Log_Dir").listFiles(fileNameFilter).sort(fileSortCondition).reverse()

如果要通过文件属性进行过滤,请实现FileFilter接口。

def fileFilter = {  file ->
        if(file.isDirectory())
             return false 
        else
            return true }  as FileFilter