ANT如何递归删除只有空目录

时间:2009-09-24 16:28:35

标签: ant build-process

有没有人知道如何使用ANT递归删除“空”目录(空包括仅包含“.svn”等的目录)。

我知道ant允许你“includeEmptyDirs = true”但我希望它只删除一个目录,如果它是空的(实际上我可能需要走上递归链并删除它包含在的目录中它现在是空的。)

基本上,作为构建过程的一部分,我们复制一组目录,其中包含一堆包含各种XML和数据的其他嵌套目录,当我们移动该数据的位置时,我们的“复制”和签入构建过程不会真的有用,而且因为我们正在检查另一个源控件(SVN),擦除目录并复制也不是一个选项(我们要吹掉“.svn”文件夹)。

在我们复制新版本之前,我可以通过执行以下操作来“清除”目录:

<delete>
  <fileset dir="${webplatformBin}" includes="**/*"/>
</delete>

这会将每个目录(带有“.svn”)留作空目录,然后复制新文件。复制之后,我不确定如何清除剩下的空目录(如果我们已完全移动到顶级数据目录的位置等)。

例如,如果我有/projectA/data/localization/text.xml文件并将其移至/projectB/data/localization/text.xml,我最终会得到一个空的文件夹/ p​​rojectA / data / localization /(只包含.svn文件夹)。

5 个答案:

答案 0 :(得分:18)

这是我能够提出的最佳答案:

<delete includeemptydirs="true">
  <fileset dir="${dirToStartFrom}"  >
    <and>
      <size value="0"/>
      <type type="dir"/>
     </and>
  </fileset>
</delete>

然后我将它包装在宏中,这样我就可以从任何目标中传递目录名称:

<!-- Find and delete empty folders under dir -->
<macrodef name="deleteEmptyFolders">
    <attribute name="dir"/>
    <sequential>
        <delete includeemptydirs="true">
            <fileset dir="@{dir}"  >
                <and>
                    <size value="0"/>
                    <type type="dir"/>
                </and>
            </fileset>
        </delete>
    </sequential>
</macrodef>

像这样:

<target name="clean">
  <deleteEmptyFolders dir="build"/>
  <deleteEmptyFolders dir="common"/>
  <deleteEmptyFolders dir="lib"/>
</target>

答案 1 :(得分:2)

答案 2 :(得分:0)

如果不足以完全清除目标位置(使用defaultExcludes =“false”以确保删除.svn文件夹),您可以尝试writing a custom ant task遍历目标下方的文件系统,删除为空从每个叶子向后移动的目录。

答案 3 :(得分:0)

对于从ant调用的批处理文件,这可能更容易。

您可以使用Raymond Chen's script,但如果名称中有空格,则无效。

答案 4 :(得分:0)

我能够使用以下命令删除从当前工作目录开始的所有空目录:

<delete includeemptydirs="true">
    <fileset dir="." includes="**" excludes="**/*.*" />
</delete>