如何用Ant查找包含指定文件的子目录并执行<apply>任务
Ant 目录扫描执行任务实现方案
实现思路
你不需要手动关联dirset和fileset的匹配结果,直接用Ant内置的匹配规则就能筛选出存在foo.txt的子目录,两种实现方式如下:
方式1:原生Ant实现(无需扩展包,推荐)
直接通过<apply>的内置映射规则,匹配所有foo.txt后以文件所在目录为工作目录执行任务,示例代码:
<project name="fooProcess" default="run" basedir="."> <target name="run"> <apply executable="你要执行的命令路径" parallel="false" relative="true" > <!-- 扫描TargetFolder下所有foo.txt文件 --> <fileset dir="TargetFolder" includes="**/foo.txt" /> <!-- 配置映射:将foo.txt映射为其所属的父目录 --> <mapper type="regexp" from="^(.*[/\\])foo\.txt$" to="\1" /> <!-- 配置命令参数,可按需调整,以下为示例 --> <arg value="--input-dir" /> <targetfile/> <arg value="--config" /> <srcfile/> </apply> </target> </project>
方式2:预筛选目录后执行(适合需要额外处理目录的场景)
如果需要先拿到所有符合条件的目录列表,可以用<present>选择器先筛选目录,再批量执行:
<project name="fooProcess" default="run" basedir="."> <!-- 引入ant-contrib扩展,仅使用foreach时需要 --> <taskdef resource="net/sf/antcontrib/antcontrib.properties"> <classpath> <pathelement location="你的ant-contrib.jar路径"/> </classpath> </taskdef> <target name="run"> <!-- 筛选所有包含foo.txt的子目录 --> <dirset id="validDirs" dir="TargetFolder"> <present targetdir="TargetFolder"> <mapper type="glob" from="*" to="*/foo.txt"/> </present> </dirset> <!-- 循环每个符合条件的目录执行apply --> <foreach target="processSingleDir" param="currentDir"> <path refid="validDirs"/> </foreach> </target> <target name="processSingleDir"> <echo>当前处理目录: ${currentDir}</echo> <apply executable="你要执行的命令路径" dir="${currentDir}"> <!-- 你的apply任务配置 --> <arg value="foo.txt"/> </apply> </target> </project>
第二种方式依赖ant-contrib扩展包,无特殊需求优先使用第一种原生实现即可。
内容的提问来源于stack exchange,提问作者Mr Pablo
相关产品推荐
相关产品推荐

