如何使用 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 中,您将能够使用 &lt;allbutlast count=2"&gt; 来实现与当前 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 个文件之外的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

删除 bash 脚本中除了最新的 3 个文件之外的所有文件

如何在 Kotlin 中使用 anko 删除除最新 10 条记录之外的所有记录?

SQL Server:删除除最新的“n”个结果之外的所有结果

如何从文件名中删除除括号内容之外的所有内容

删除除文件扩展名之外的所有内容[重复]

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