如何使用 Ant 删除除最新 2 个文件以外的所有文件
How to delete all but latest 2 files using Ant
使用 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>
有没有更简单的方法?
我建议使用文件集选择器来选择应该对哪些文件进行操作。
如果要求超出 ANT 的正常功能范围,您可以编写标准脚本。以下示例是根据日期删除文件:
- Linux removing folders older than 1 year and more than 3 files
这个问题导致 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>
我非常喜欢 Stefan Bodewig 的回答,迫不及待想要使用 Ant 1.9.6(撰写本文时的当前版本),但我已锁定 Ant 1.9.4。所以我写了这个删除旧目录但保留最新 5 个的小东西。也许它对其他人也有一些用处。
PS
At the time I wrote the script, I did not notice how powerful the solution suggested by Mark O'Connor is. I probably should have merged my solution into a script selector, but now it's too late. :-(
如果您想知道这是什么:它是一个 JavaScript 脚本,位于 "script" Ant task. I would have preferred Groovy or Ruby, but I chose JavaScript, because it was already in the tools bundle I'm currently depending on (see the 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 个文件之外的所有文件。
我试图否定 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>
有没有更简单的方法?
我建议使用文件集选择器来选择应该对哪些文件进行操作。
如果要求超出 ANT 的正常功能范围,您可以编写标准脚本。以下示例是根据日期删除文件:
- Linux removing folders older than 1 year and more than 3 files
这个问题导致 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>
我非常喜欢 Stefan Bodewig 的回答,迫不及待想要使用 Ant 1.9.6(撰写本文时的当前版本),但我已锁定 Ant 1.9.4。所以我写了这个删除旧目录但保留最新 5 个的小东西。也许它对其他人也有一些用处。
PS
At the time I wrote the script, I did not notice how powerful the solution suggested by Mark O'Connor is. I probably should have merged my solution into a script selector, but now it's too late. :-(
如果您想知道这是什么:它是一个 JavaScript 脚本,位于 "script" Ant task. I would have preferred Groovy or Ruby, but I chose JavaScript, because it was already in the tools bundle I'm currently depending on (see the 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>