Ant / Groovy:如何删除超过给定日期的文件,但最多保留3个[重复]

Posted

技术标签:

【中文标题】Ant / Groovy:如何删除超过给定日期的文件,但最多保留3个[重复]【英文标题】:Ant/Groovy: How to delete files over than given date, but keep a maximum of 3 [duplicate] 【发布时间】:2016-08-12 12:28:39 【问题描述】:

使用如下所示的代码在日志目录中随时间老化文件。 MAX_LOG_FILE_AGE 可以计算或设置为任何所需的值。这会正确删除比预期旧的文件。

问题源于我收到的要求发生变化,改为仅保留一定数量的最新文件,在我的情况下为三 (3) 个。如何实现?

long deleteDate = System.currentTimeMillis() - MAX_LOG_FILE_AGE
def ant = new AntBuilder()
ant.delete() 
fileset (dir: "$someParentDir/logs/", includes: '**/*') 
    date(millis: "$deleteDate", when: 'before')
    

【问题讨论】:

另一个答案可以很容易地改用基于 groovy 的选择器。 使用 'ant' 不会成为答案的一部分(现在),所以如果重新打开该答案可以显示。 【参考方案1】:

这对于 Ant 来说很难做到。但是在直接的 Groovy 中,它是易于处理的:

def MAX_LOG_FILE_AGE_IN_MILLIS = 24 * 60 * 60 * 1000
def deleteDate = System.currentTimeMillis() - MAX_LOG_FILE_AGE_IN_MILLIS

def logDir = "logs"
def logs = []

// build list of files
new File(logDir).eachFileRecurse  file ->
    if (file.isFile() && (file.lastModified() < deleteDate)) 
        logs << file
    


// sort by last modified (ascending)
def sortedLogs = logs.toSorted  a,b -> a.lastModified() <=> b.lastModified() 

// N most recent are skipped 
def n = 3
def victims = sortedLogs.dropRight(n)

// delete victims
victims.each  victim ->
    println "deleting $victim.name"
    victim.delete()

【讨论】:

谢谢您-根据您的建议,我制作了一个仅限 groovy 的实现。我想证明这一点,但需要重新打开问题才能这样做。

以上是关于Ant / Groovy:如何删除超过给定日期的文件,但最多保留3个[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 ets 表中删除日期戳超过 10 秒的所有记录

如果当前日期时间超过预定日期时间,如何删除本地通知?

从FTP下载文件(Groovy ANT任务)

java日期问题 如何将给定的俩时间 之间的月份列出来

如果两个列表超过给定的欧几里德距离,如何从两个列表中删除特定值?

用SQL语句计算出给定日期是星期几?