文件名复制任务中的Apache ant字符选择器

时间:2015-08-08 19:34:37

标签: regex ant

对于这样的文件集:

XXX_staging
    A_filename\A_filename.txt
    B_filenAme\B_filenAme.txt

XXX_AL_staging

以下ant目标只会将名称以大写" A"开头的文件从XXX_staging文件夹复制到XXX_AL_staging文件夹:

<target name="split_topics">
      <copy todir="XXX_AL_staging\" verbose="true" overwrite="true">
        <fileset dir=".\XXX_staging" includes="**/A*.txt">
        </fileset>
  </copy>
 </target>

我想要做的只是复制名称以A到L开头的文件。这不起作用:

<target name="split_topics">
      <copy todir="XXX_AL_staging\" verbose="true" overwrite="true">
        <fileset dir=".\XXX_staging" includes="**/[A-L]*.txt">
        </fileset>
  </copy>
 </target>

我想知道问题是第二个不仅仅是像第一个那样的通配符匹配,而是一个正常的表达式匹配,它不能用于文件名吗?我不想匹配文件的内容,只是文件名,所以containsregexp似乎已经出来了。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

Filename selectors可以使用正则表达式。

示例1

├── build.xml
├── src
│   └── somedir
│       ├── A_filename.txt
│       ├── B_filename.txt
│       ├── C_filename.txt
│       ├── D_filename.txt
│       ├── E_filename.txt
│       ├── F_filename.txt
│       └── G_filename.txt
└── target
    └── somedir
        ├── A_filename.txt
        ├── B_filename.txt
        ├── C_filename.txt
        └── D_filename.txt

的build.xml

<project name="demo" default="copy">

  <property name="src.dir"   location="src"/>
  <property name="build.dir" location="target"/>

  <target name="copy">
    <copy todir="${build.dir}" overwrite="true" verbose="true">
      <fileset dir="${src.dir}">
        <filename regex="\/[A-D].*.txt$"/>
      </fileset>
    </copy>
  </target>

</project>

示例2

答案 1 :(得分:0)

不幸的是,ant patterns不是正则表达式,甚至不是一点。它们是通配符,语法非常有限。对于复杂的解决方案,您可以使用在Javascript中定义自己的任务并编写代码的功能,但这不会让您创建替代文件集模式匹配语法。