ANT build-删除多个dirsets

时间:2011-01-18 21:47:27

标签: ant build backup

我在构建文件中添加了一个目标,使用时间戳删除超过4天的备份:

    <tstamp>
        <format pattern="MM/DD/yyyy HH:MM aa" offset="-4" property="backup.deletedate" />
    </tstamp>
    <echo message="Deleting log directories created on or before ${backup.deletedate}" />
    <delete verbose="true">
        <dirset dir="${backup.dir}/CI">
            <date datetime="${backup.deletedate}" when="before" checkdirs="true" />
        </dirset>
        <dirset dir="${backup.dir}/DEV_MASTER">
            <date datetime="${backup.deletedate}" when="before" checkdirs="true" />
        </dirset>
    </delete>

但是它会从第一个目录(CI)删除并跳过第二个目录。

如何将其设置为从BOTH目录中删除?

3 个答案:

答案 0 :(得分:1)

似乎dirset集合正在跳过非空目录。我通过使用整个备份目录的文件集来克服它:

    <tstamp>
        <format pattern="MM/DD/yyyy HH:MM aa" offset="-4" property="backup.deletedate" />
    </tstamp>
    <echo message="Deleting log directories created on or before ${backup.deletedate}" />       
    <delete verbose="true" includeemptydirs="true">
        <fileset dir="${backup.dir}">               
            <date datetime="${backup.deletedate}" when="before" checkdirs="true" />
        </fileset>
    </delete>

像魅力一样!

答案 1 :(得分:0)

合并你的dirsets。

<delete verbose="true">
    <dirset dir="${backup.dir}" includes="CI,DEV_MASTER">
        <date datetime="${backup.deletedate}" when="before" checkdirs="true" />
    </dirset>
</delete>

答案 2 :(得分:0)

以下是使用exec任务删除一级子目录(可用于清理夜间构建系统的解决方案)的解决方案:

<exec executable="find" osfamily="unix">
  <arg value="path/to/dir" />
  <arg value="-mindepth" />
  <arg value="1" />
  <arg value="-maxdepth" />
  <arg value="1" />
  <arg value="-type" />
  <arg value="d" />
  <arg value="-mtime" />
  <arg value="+4" />
  <arg value="-exec" />
  <arg value="rm" />
  <arg value="-rf" />
  <arg value="{}" />
  <arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
  <arg value="/P" />
  <arg value="path\to\dir" />
  <arg value="/D" />
  <arg value="-4" />
  <arg value="/C" />
  <arg value="cmd /c IF @isdir == TRUE rd /S /Q @path" />
</exec>

如果您不需要限制一级子目录,则可以使用以下内容:

<exec executable="find" osfamily="unix">
  <arg value="path/to/dir" />
  <arg value="-mindepth" />
  <arg value="1" />
  <arg value="-type" />
  <arg value="d" />
  <arg value="-mtime" />
  <arg value="+4" />
  <arg value="-exec" />
  <arg value="rm" />
  <arg value="-rf" />
  <arg value="{}" />
  <arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
  <arg value="/P" />
  <arg value="path\to\dir" />
  <arg value="/D" />
  <arg value="-4" />
  <arg value="/S" />
  <arg value="/C" />
  <arg value="cmd /c IF @isdir == TRUE rd /S /Q @path" />
</exec>

如果您还需要包含文件,请使用以下内容:

<exec executable="find" osfamily="unix">
  <arg value="path/to/dir" />
  <arg value="-mindepth" />
  <arg value="1" />
  <arg value="-mtime" />
  <arg value="+4" />
  <arg value="-exec" />
  <arg value="rm" />
  <arg value="-rf" />
  <arg value="{}" />
  <arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
  <arg value="/P" />
  <arg value="path\to\dir" />
  <arg value="/D" />
  <arg value="-4" />
  <arg value="/S" />
  <arg value="/C" />
  <arg value="cmd /c IF @isdir == TRUE rd /S /Q @path ELSE del /F /Q @path" />
</exec>

它适用于Windows和Linux系统。相对于纯Ant删除,优点之一是ant不生成任何文件集,因此可能更快。