如何使用 Ant 删除除最新的 2 个文件之外的所有文件
Posted
技术标签:
【中文标题】如何使用 Ant 删除除最新的 2 个文件之外的所有文件【英文标题】:How to delete all but latest 2 files using Ant 【发布时间】:2015-04-17 18:26:21 【问题描述】:使用 Ant,我必须从备份文件夹中删除除最新的 2 个文件之外的所有文件。
我试图否定last count="2"
,但找不到正确的资源顺序。
目前我正在这样做:
<delete verbose="true">
<difference>
<resources>
<fileset dir="$backup"/>
</resources>
<last count="2">
<sort>
<date/>
<resources>
<fileset dir="$backup"/>
</resources>
</sort>
</last>
</difference>
</delete>
有没有更简单的方法?
【问题讨论】:
我认为没有比这更简单的了。您可能想要提取fileset
并给它一个 id 以干燥并仅扫描一次 backup
。包装 resources
容器也是多余的,但没有根本不同的方法。 Ant 的一个增强请求是让属性更容易显示“除了最后两个之外的所有” - 可能对 first
属性使用负数或完全使用单独的属性。
感谢@StefanBodewig。我已在bz.apache.org/bugzilla/show_bug.cgi?id=57834 提出增强请求。
刚刚解决为已修复,在 Ant 1.9.5 中,您将能够使用 <allbutlast count=2">
来实现与当前 difference
相同的效果。
【参考方案1】:
这个问题导致Ant enhancement request 已申请Ant 1.9.5(在撰写本文时尚未发布)。直到 1.9.4 为止,没有更好的纯 Ant 解决方案,除非您想自己实现资源集合。
从 Ant 1.9.5 开始你可以使用
<delete verbose="true">
<allbutlast count="2">
<sort>
<date/>
<resources>
<fileset dir="$backup"/>
</resources>
</sort>
</allbutlast>
</delete>
【讨论】:
【参考方案2】:我建议使用文件集选择器来选择应该对哪些文件进行操作。
如果要求超出 ANT 的正常能力,您可以编写标准脚本。以下示例是根据日期删除文件:
Linux removing folders older than 1 year and more than 3 files【讨论】:
谢谢,我已经开始使用文件集选择器了。感谢您的脚本创意,尽管内置资源对我来说工作量较小。【参考方案3】:我非常喜欢 Stefan Bodewig 的回答,迫不及待地想要升级到 Ant 1.9.6(撰写本文时的当前版本),但我锁定在 Ant 1.9.4 上。所以我写了这个小东西,它删除了旧目录但保留了最新的 5 个。也许它对其他人也有一些用处。
PS 在我编写脚本时,我没有注意到 Mark O'Connor 建议的解决方案有多么强大。我可能应该将我的解决方案合并到一个脚本选择器中,但现在为时已晚。 :-(
如果您想知道这是什么:它是一个 javascript 脚本,位于 "script" Ant task 内。我更喜欢 Groovy 或 Ruby,但我选择了 JavaScript,因为它已经在我目前依赖的工具包中(有关更多详细信息,请参阅 Ant Library Dependencies page)。
<script language="javascript"> <![CDATA[
// number of directories to keep
var N = 5;
// imports
importClass(java.io.File)
importClass(java.lang.System)
// helper function
function println(msg)
System.out.println(msg);
// get base directory
var baseDir = new File(project.getProperty("my.base.dir"));
println(">> " + baseDir);
// filter files, keep only directories
var allFiles = baseDir.listFiles()
var directories = new Array()
for each (var file in allFiles)
if (file.isDirectory())
directories.push(file)
// comparation function by modification date, newest first
function compareByLastModified(file1, file2)
if (file1.lastModified() < file2.lastModified())
return 1
if (file1.lastModified() > file2.lastModified())
return -1
return 0;
// sort list
directories.sort(compareByLastModified)
// prepare "delete" task
var delTask = project.createTask("delete");
delTask.setQuiet(true);
// Delete all directories except last N in the list
for each (var dir in directories.slice(N))
//println(" del " + dir.toString())
delTask.setDir(dir)
delTask.perform()
]]> </script>
【讨论】:
以上是关于如何使用 Ant 删除除最新的 2 个文件之外的所有文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中使用 anko 删除除最新 10 条记录之外的所有记录?