使用mapper和fileset将文件复制到不同的子目录中?

gjt*_*ian 8 ant build-process copy

我想创建一个Ant目标,它将目录中的文件复制到具有相同文件夹结构的目标目录,再添加一个子文件夹.

例如,来源是:

a/b/c/foo.pdf
d/e/f/bar.pdf
Run Code Online (Sandbox Code Playgroud)

我希望目的地是:

a/b/c/x/foo.pdf
d/e/f/x/foo.pdf
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

mar*_*ton 12

您可以使用regexp映射器:

<copy todir="${dest.dir}">
    <fileset dir="${src.dir}" casesensitive="yes">
        <include name="**/*.pdf"/>
    </fileset>
    <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" />
</copy>
Run Code Online (Sandbox Code Playgroud)

我使用了硬编码的file.separators来缩短.基本上,您将路径分配到输入文件(从)到目录和文件名(捕获\1\2),然后\x在它们之间插入额外的元素(到).

我不清楚你的例子 - 看起来你想匹配'bar.pdf'并将其重命名为'foo.pdf',以及更改目录.如果你需要这样做,你可能会考虑链接几个更简单的正则表达式映射器,而不是尝试烹饪一个复杂的映射器:

<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>
Run Code Online (Sandbox Code Playgroud)

使用glob映射器时,需要*在from字段中指定一个通配符:

往返都是必需的,并定义最多可包含一个*的模式.对于与from模式匹配的每个源文件,将通过在from模式中使用与from模式中的*匹配的文本中的*替换to模式来构造目标文件名.将忽略与from模式不匹配的源文件名.

所以像这样的东西可能有效:

<mapper type="glob" from="*/foo.pdf" to="*/x/foo.pdf" />
Run Code Online (Sandbox Code Playgroud)