我正在用ant文件集/regexpmapper玩砖墙,试图简单地重命名一个目录(位于路径中间)。。。
情况很简单:
- 我有正在复制到
DB/api/src/main/distribution/component
的路径component/DB/
- 路径组件/DB包含一组install.sql脚本和一个名为
api
(或"API"或"API")的目录。这个"api"目录包含额外的sql,并将被批量复制到目标DB/api/component
中(因此创建DB/api/src/main/distribution/component/api
) - 作为这个副本的一部分,为了保持一致性,我只想将"api"目录名小写
听起来很简单,我一直在使用文件集和regexpmapper
(或mapper type=regexp
)来实现这一点。然而,我得到了喜忧参半的结果。。。值得注意的是,一旦我在中输入"/"(或"\\"、"/"或${file.separator}
,即使使用regexpmapper.handledirsep=yes
),它就不起作用。
以下是混淆的源路径结构(来自find
):
component/DB/
component/DB/API
component/DB/API/file1.sql
component/DB/API/file2.sql
component/DB/xyz.sql
component/DB/Install_API.sql
component/DB/excludes1/...
我的基本副本如下:
<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true">
<fileset dir="${component.src.dir}/DB">
<exclude name="exclude1"/>
<exclude name="exclude1/**/*"/>
</fileset>
<regexpmapper handledirsep="yes"
from="(.*)/API(.*)" to="1/api2"/>
<!--mapper type="regexp" from="(.*)/API(.*)" to="1/api2"/-->
</copy>
为了清楚起见,我留下了"/"字。你可以看到,基本前提是发现"API",抓取周围的文本,然后用"API"回放。如果我在from
中省略了"/",那么这确实有效,但只要我把"/"(或它的朋友)放进去,目录就根本不会复制。请注意,我想要前面的"/",因为我只想重命名该目录,而不是其中包含的Install_API.sql文件。
网上有很多示例,但似乎没有人遇到过这个问题,因为所谓的工作示例似乎都使用了普通的"/"、"\"或声称由handledirset
属性处理。
RH6.3 上的蚂蚁1.8.4
非常感谢。
您的文件集的基本目录是DB
目录,这意味着您的映射程序将映射的路径的形式为
API/file1.sql
Install_API.sql
excludes1/...
相对于该目录。因此,API
目录名前面没有斜杠,from
模式永远不会匹配。但还有一个更深层次的问题,那就是regexpmapper完全忽略任何与from
模式不匹配的文件名。这不是您想要的,因为您需要将API
更改为api
,但保持非API文件名不变。因此,您需要的不是regexpmapper
,而是带有replaceregex
过滤器的filtermapper
:
<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true">
<fileset dir="${component.src.dir}/DB">
<exclude name="exclude1"/>
<exclude name="exclude1/**/*"/>
</fileset>
<filtermapper>
<!-- look for either just "API" with no trailer, or API followed by
a slash, in any combination of case -->
<replaceregex pattern="^API(?=${file.separator}|$$)" replace="api"
flags="i"/><!-- case-insensitive search, finds API, Api, ... -->
</filtermapper>
</copy>