使用映射器和文件集将文件复制到其他子目录吗?

问题描述 投票:8回答:1

我想创建一个Ant目标,该目标将目录中的文件复制到具有相同文件夹结构的目标目录,并附加一个子文件夹。

例如,来源是:

a/b/c/foo.pdf
d/e/f/bar.pdf

我希望目的地是:

a/b/c/x/foo.pdf
d/e/f/x/bar.pdf

到目前为止,这是我的目标,但似乎没有做任何事情:

<copy todir="${dest.dir}">
   <fileset dir="${src.dir}" casesensitive="yes">
       <include name="**${file.separator}foo.pdf" />
   </fileset>      
   <mapper type="glob"
           from="foo.pdf" to="x${file.separator}foo.pdf" />            
</copy>

我想念什么?

ant build-process copy
1个回答
13
投票

您可以使用regexp映射器:

regexp

我使用硬编码的file.separators来缩短。基本上,您将输入文件的路径(从)拆分为目录和文件名(捕获<copy todir="${dest.dir}"> <fileset dir="${src.dir}" casesensitive="yes"> <include name="**/*.pdf"/> </fileset> <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" /> </copy> \1),然后在它们之间插入\2额外元素(至)。

我不清楚您的示例-您似乎想匹配'bar.pdf',并将其重命名为'foo.pdf',以及更改目录。如果您需要这样做,可以考虑链接几个简单的正则表达式映射器,而不是尝试制作一个复杂的正则表达式:

\x

[使用<copy todir="${dest.dir}"> <fileset dir="${src.dir}" casesensitive="yes"> <include name="**/*.pdf"/> </fileset> <chainedmapper> <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" /> <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/foo.pdf" /> </chainedmapper> </copy> 映射器时,您需要在from字段中指定一个通配符glob

往返都是必需的, 定义可能包含的模式 最多一个*。对于每个源文件 匹配from模式,目标 文件名将从 通过将*替换为模式 以图案作为文本 匹配from模式中的*。 源文件名与 from模式将被忽略。

所以类似的事情可能会起作用:

glob
© www.soinside.com 2019 - 2024. All rights reserved.