我有一个文件,其文件路径类似于“LibraryX/A/Stuff/FileY.txt”,我在 Ant 构建中将其用作包含文件。但是,我需要在复制过程中删除路径的“LibraryX/A/”部分:文件从“LibraryX/A/Stuff/FileY.txt”复制并进入“Stuff/FileY.txt” ”。我研究过一些正则表达式映射器,但没有取得任何成功。 :/
这样做的目的是目标文件夹可以覆盖“Stuff/MoreStuff”中的自定义文件,我想使用 overwrite="false" 将磁盘访问保持在最低限度并保持自定义文件完整。
蚂蚁:
<copy todir="C:/targetdir/" overwrite="false">
<fileset dir="C:/sourcedir/">
<includesfile name="C:/targetdir/includes.file" />
</fileset>
</copy>
包括.文件:
LibraryX/A/Stuff/FileA.txt
LibraryX/A/Stuff/FileB.txt
LibraryX/A/Stuff/FileC.txt
LibraryX/A/Stuff/FileY.txt
来源目录:
sourcedir/LibraryX/A/Stuff/FileA.txt
sourcedir/LibraryX/A/Stuff/FileB.txt
sourcedir/LibraryX/A/Stuff/FileC.txt
sourcedir/LibraryX/A/Stuff/FileY.txt
目标目录:
targetdir/Stuff/FileY.txt
现在,位于 sourcedir 的 Stuff 文件夹中的所有文件都应结束于 targetdir 中的 Stuff 文件夹。但如何呢?
奖励:如果我从“targetdir/LibraryX/A/Stuff”移动文件,它们将覆盖“targetdir/Stuff”文件夹中的所有内容,即使覆盖=“false”。大概是因为它们是比当前 Stuff 文件夹中的文件更新的文件。
注意: 当然,我可以将自定义文件从目标目录移走,复制内容,然后将自定义文件移回,覆盖新文件。但这会大量访问磁盘,从而减慢进程。
从 Ant v1.8.2 开始,您可以使用
cutdirsmapper
从文件路径中删除一些前导目录。请参阅映射器类型文档的最底部。
<copy todir="C:/targetdir/" overwrite="false">
<fileset dir="C:/sourcedir/">
<includesfile name="C:/targetdir/includes.file" />
</fileset>
<cutdirsmapper dirs="2"/>
</copy>
奖励: 您可以使用 touch ant 任务使 targetdir 中的所有文件比所有源文件更新,从而防止它们被覆盖。
如果您想在复制过程中从路径中间删除某些内容,您可以使用此处描述的filtermapper。
<copy todir="C:/targetdir/" overwrite="false">
<fileset dir="C:/sourcedir/" includes="**/*.*" />
<filtermapper>
<replacestring from="LibraryX/A/" to="" />
</filtermapper>
</copy>