使用Apache Ant删除所有但最近的3个目录

时间:2018-05-19 20:55:36

标签: ant

我有一个场景,其中有一个"存档"包含各种子目录的目录。我只想保留最近的三个子目录。所以,例如我有:

archive/
  subA/    [created 1-May-2018]
  subB/    [created 2-May-2018]
  subC/    [created 3-May-2018]
  subD/    [created 4-May-2018]
  subE/    [created 5-May-2018]

换句话说,我希望能够选择subA和subB(基于它们的文件系统日期)并删除它们 - 包括其中的所有文件和子目录。我可以很容易地做一个执行此操作的Python脚本,但更喜欢纯Ant解决方案。

基于另一个StackOverflow问题(How to delete all but latest 2 files using Ant),我尝试过:

<resources id="deleteDirs">
  <allbutlast count="3" >
    <sort>
      <date />
      <resources>
        <dirset dir="${dir.archive}" includes="*" />
      </resources>
    </sort>
  </allbutlast>
</resources>
<echo message="Delete directories: ${toString:deleteDirs}" />

<delete verbose="true">
  <resources refid="deleteDirs" />
</delete>

然而,这个和我提出的任何其他变化都不起作用。但是请注意,删除后的deleteDirs refid确实显示了我想要选择的内容,但删除任务会悄悄忽略它。

在简要检查删除任务的来源时,有一些注释表明删除在某些时候被重构以执行弃用的 deltree 任务(显然无法包裹资源,dirset或路径)。所以,我猜测当 deltree 进入删除时,它仍然只适用于表单:

<delete dir="DIRNAME"/>

而不是在包装资源集合时。

基本上是否有纯粹的Ant方式:

<deltree dir="${dir.archive}/subA" />
<deltree dir="${dir.archive}/subB" />

但是,如果没有对 deltree 任务中的选择进行硬编码,并允许Ant根据日期选择除最近三个目录之外的所有目录。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我很震惊,这个问题没有解决很长时间。显然,任务不适用于类型为的资源集合。我唯一能解决的问题的解决方案是使用ant-contrib并执行以下操作:

    <for param="folder">
        <path>
            <allbutlast count="${to.keep.count}">
                <sort>
                    <dirset dir="${dir.archive}" includes="*"/>
                </sort>
            </allbutlast>
        </path>
        <sequential>
            <delete dir="@{folder}"/>
        </sequential>
    </for>

如果任何人都可以在不使用Ant-Contrib的情况下提出解决方案,我将非常非常感激(而且我相信不仅我自己)。

当然,完美的解决方案是按如下方式进行这项工作:

    <delete verbose="true">
            <allbutlast count="${to.keep.count}">
                <sort>
                    <dirset dir="${dir.archive}" includes="*"/>
                </sort>
            </allbutlast>
    </delete>

但不幸的是,这不起作用。