如何用Apache Ant删除除最近3个目录外的所有子目录
刚好之前遇到过类似的问题,Ant的<delete>任务确实不直接支持资源集合作为输入,但我们可以绕个小弯子解决这个问题:先把筛选出来要删除的目录路径写到一个临时文件,再让<delete>读取这个文件执行删除操作。下面是完整的纯Ant实现方案:
完整Ant脚本示例
<project name="clean-archive-old-dirs" default="remove-old-archives"> <!-- 配置参数:archive目录路径和临时文件路径 --> <property name="target.archive.dir" value="archive"/> <property name="temp.delete.list.file" value="temp-delete-dirs.txt"/> <target name="generate-delete-list"> <!-- 1. 选中archive下的所有子目录 --> <dirset id="all.archive.dirs" dir="${target.archive.dir}"> <include name="*"/> </dirset> <!-- 2. 按目录最后修改时间降序排序(最新的排在最前面) --> <sort id="sorted.archive.dirs" resourceid="all.archive.dirs"> <date xmlns="antlib:org.apache.tools.ant.types.resources.comparators" reverse="true" property="lastmodified"/> </sort> <!-- 3. 排除最新的3个目录,剩下的就是要删除的旧目录 --> <allbutlast id="dirs.to.delete" resourceid="sorted.archive.dirs" count="3"/> <!-- 4. 将待删除目录的路径转换为每行一个的格式,写入临时文件 --> <pathconvert pathsep="${line.separator}" property="delete.paths"> <resources refid="dirs.to.delete"/> </pathconvert> <echo file="${temp.delete.list.file}" message="${delete.paths}"/> </target> <target name="remove-old-archives" depends="generate-delete-list"> <!-- 读取临时文件中的目录路径,执行删除(包括目录下的所有内容) --> <delete includeEmptyDirs="true"> <fileset dir="${target.archive.dir}" includesfile="${temp.delete.list.file}"/> </delete> <!-- 清理临时文件 --> <delete file="${temp.delete.list.file}"/> </target> </project>
关键步骤解释
- 筛选目录:用
<dirset>选中archive下的所有子目录,再通过<sort>按最后修改时间降序排列,确保最新的目录排在最前面。 - 排除保留目录:用
<allbutlast>排除前3个最新的目录,剩下的就是需要删除的旧目录集合。 - 生成删除列表:通过
<pathconvert>把资源集合转换为每行一个路径的字符串,写入临时文件——这一步是关键,因为<delete>支持通过includesfile参数读取每行一个路径的文件来执行删除。 - 执行删除:
<delete>读取临时文件中的路径,删除对应的目录及其所有内容,最后清理临时文件。
额外说明
- 如果
archive下的子目录数量不足3个,<allbutlast>会返回空集合,此时不会删除任何内容,符合需求。 includeEmptyDirs="true"确保空目录也会被正常删除。
内容的提问来源于stack exchange,提问作者DocOc
相关产品推荐
相关产品推荐

