如何使用 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>