我想使用Ant重命名文件,保持其目录结构。
e.g。假设以下目录结构:
- copy
- new
- testthis.a
使用下面的代码,我可以重命名包含"这个"单词" that.a"使用复制任务,但他们都被粘贴到"粘贴"目录失去了目录结构。
<copy todir="paste" overwrite="true">
<fileset dir="copy"/>
<regexpmapper from="^(.*)this(.*)\.a$$" to="that.a"/>
</copy>
输出:
- paste
- that.a
如果我将regexmapper更改为(在那之前注意\ 1.a):
<regexpmapper from="^(.*)this(.*)\.a$$" to="\1that.a"/>
它正在生成正确的目录结构,但总是在&#34之前添加单词;这个&#34; to&#34; that.a&#34;
输出:
- paste
- new
- testthat.a
有没有办法重命名维护其目录结构的文件而不预先挂起或附加任何单词?
还有其他可以用于同一个的映射器吗?
任何帮助都将不胜感激。
答案 0 :(得分:2)
<copy todir="paste" verbose="true">
<fileset dir="copy" includes="**/*this*.a"/>
<regexpmapper from="((?:[^/]+/)*)[^/]+$$" to="\1that.a" handledirsep="true"/>
</copy>
首先,设置handledirsep="true"
允许我们使用正斜杠来匹配反斜杠。这使正则表达式更清晰。
接下来,我将粗略的正则表达式解释为部分。
我将((?:[^/]+/)*)
分解为......
(
(?:
[^/]+
/
)
*
)
这些部分意味着什么:
( -- capture group 1 starts
(?: -- non-capturing group starts
[^/]+ -- greedily match as many non-directory separators as possible
/ -- match a single directory-separator character
) -- non-capturing group ends
* -- repeat the non-capturing group zero-or-more times
) -- capture group 1 ends
以上部分重复匹配尽可能多的子目录。 (
和)
将所有匹配项放入捕获组1.稍后,捕获组1可用于to
的{{1}}属性<regexpmapper>
反向引用。
如果路径中没有\1
目录分隔符,则上述部分不会匹配任何内容,捕获组1将为空字符串。
移到正则表达式的末尾,/
将正则表达式锚定到$$
选择的每个路径的末尾。
在双美元符号表达式<fileset>
中,第一个$$
转义第二个$
。这是必要的,因为Ant会将单个$
视为属性引用的开头。
$
只匹配文件名,因为它匹配路径末尾不是目录分隔符([^/]+
)的所有字符。
给出以下目录结构......
/
...... Ant输出......
- copy (dir)
- new (dir)
- notthis.b
- testthis.a
- anythis.a
答案 1 :(得分:0)
试试这个<regexpmapper from="^(.*)/([^/]*)this(.*)\.a$$" to="\1/that\3"/>
:
\1
这会切断路径(\2
)和文件名前缀(\3
),因此您可以保留目录结构。
此外,如果在替换字符串中使用\D
,则可以保留文件扩展名。