我有一个场景,其中有一个"存档"包含各种子目录的目录。我只想保留最近的三个子目录。所以,例如我有:
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根据日期选择除最近三个目录之外的所有目录。
答案 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>
但不幸的是,这不起作用。