【问题标题】:How to delete all but latest 2 files using Ant如何使用 Ant 删除除最新的 2 个文件之外的所有文件
【发布时间】:2023-03-11 18:35:01
【问题描述】:

使用 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 相同的效果。

标签: ant


【解决方案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 的正常能力,您可以编写标准脚本。以下示例是根据日期删除文件:

    【讨论】:

    • 谢谢,我已经开始使用文件集选择器了。感谢您的脚本创意,尽管内置资源对我来说工作量较小。
    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      相关资源
      最近更新 更多