如何在 Ant 复制过程中剥离一个文件夹

问题描述 投票:0回答:2

我有一个文件,其文件路径类似于“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

现在,位于 sourcedirStuff 文件夹中的所有文件都应结束于 targetdir 中的 Stuff 文件夹。但如何呢?

奖励:如果我从“targetdir/LibraryX/A/Stuff”移动文件,它们将覆盖“targetdir/Stuff”文件夹中的所有内容,即使覆盖=“false”。大概是因为它们是比当前 Stuff 文件夹中的文件更新的文件。

注意: 当然,我可以将自定义文件从目标目录移走,复制内容,然后将自定义文件移回,覆盖新文件。但这会大量访问磁盘,从而减慢进程。

ant
2个回答
8
投票

从 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 中的所有文件比所有源文件更新,从而防止它们被覆盖。


0
投票

如果您想在复制过程中从路径中间删除某些内容,您可以使用此处描述的filtermapper

<copy todir="C:/targetdir/" overwrite="false">
    <fileset dir="C:/sourcedir/" includes="**/*.*" />
    <filtermapper>
      <replacestring from="LibraryX/A/" to="" />
    </filtermapper>
</copy>
© www.soinside.com 2019 - 2024. All rights reserved.