Ant 模式匹配 - * 与 **

Ant Pattern Matching - * vs. **

我们正在使用 TeamCity 生成 *.nupkg 我们不想清理的工件。 TeamCity 提供了一个字段,您可以在其中指定 ANT 样式的模式来指示要清理或不想清理哪些文件。让我们暂时假设我们有以下不想清理的文件:

/a.nupkg
/dir1/b.nupkg
/dir1/dir2/c.nupkg

*.nupkg 模式是否匹配根目录和所有子目录中的 .nupkg 文件,还是需要使用 **.*nupkg 遍历所有目录?

我阅读了以下文档,但这对我来说仍然是模棱两可的:http://ant.apache.org/manual/dirtasks.html#patterns

如果有 Ant-Pattern 测试器(类似于 http://regexpal.com/)那就太棒了。

匹配所有目录中的所有文件(从基目录开始及更深)

**/*.nupkg

将匹配

sample.nupkg
sample-2.nupkg
tmp/sample.nupkg
tmp/other.nupkg
other/new/sample.nupkg

** 将匹配任何目录(多个目录深)。

*.nupkg 将匹配具有 nupkg 扩展名的任何文件。或者只是 * 将匹配任何文件或任何目录(但只是一个目录深度)。

PS: 没有Ant Pattern Tester.

为了测试您的模式,一种简单的方法是将您的文件集内容回显到标准输出或文件,f.e。 :

<project>
  <fileset dir="..." id="foobar">
   <include name="..."/>
   <!-- .. -->
  </fileset>

  <!-- simple echo -->
  <echo>${toString:foobar}</echo>

  <!-- use pathconvert for listing files line by line -->
  <pathconvert property="foo" pathsep="${line.separator}" refid="foobar"/>

  <!-- simple echo -->
  <echo>${foo}</echo>

  <!-- print to file -->
  <echo file="whatever.txt">${foo}</echo>

  <!-- use nested mapper if you need only basename -->
  <pathconvert property="fooflat" pathsep="${line.separator}" refid="foobar">
   <mapper>
    <flattenmapper />
   </mapper>
  </pathconvert>

  <echo>$${fooflat} => ${line.separator}${fooflat}</echo>

  <!-- to combine several filesets use -->
  <path id="fooo">
   <fileset dir="...">
    <include name=".."/>
   </fileset>
   <fileset>
     <!-- ... -->
   </fileset>
   <fileset>
     <!-- ... -->
   </fileset>
    <!-- ... -- >
  </path>

  <echo>$${fooo} => ${fooo}</echo>

</project>