我想创建一个Ant目标,它将目录中的文件复制到具有相同文件夹结构的目标目录,再加上一个子文件夹。
例如,来源是:
a/b/c/foo.pdf
d/e/f/bar.pdf
我希望目的地为:
a/b/c/x/foo.pdf
d/e/f/x/foo.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>
我错过了什么?
答案 0 :(得分: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>
我使用了硬编码的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>
使用glob
映射器时,您需要在from字段中指定一个通配符*
:
往返都是必需的 定义可能包含at的模式 大多数人*。对于每个源文件 匹配from模式,一个目标 文件名将由。构造 通过替换* in来模式化 带有文本的模式 匹配from模式中的*。 源文件名与。不匹配 来自模式将被忽略。
这样的事情可能有用:
<mapper type="glob" from="*/foo.pdf" to="*/x/foo.pdf" />