仅复制具有另一个文件作为同级文件的文件 [基于扩展名]?

Copying only files which have another file as a sibling [based on extension]?

我正在尝试使用 ANT 将一些 C++ 构建文件复制到另一个目录中。

构建的输出如下所示:

/Build
   /LibA
      LibA.lib
      LibA.pdb
   /LibB
      LibB.lib
      LibB.pdb
   /ProjA
      myexe.exe
      myexe.pdb
   /Foo
      foo.exe
      foo.pdb
   /...

现在,我想将所有 *.exe 文件及其 *.pdb 文件复制到另一个目录(但不是库的 *.pdb 文件)。

我试过:

<copy todir="outdir">
   <fileset dir="Build">
      <include name="**/*.exe" />
      <include name="**/*.pdb" />
   </fileset>
</copy>

不过,我也会在 LibA、LibB、... 文件夹中获取 *.pdb 文件。

有什么方法可以让我只复制具有 *.exe 文件的 pdb 文件和它们的同级目录中的文件?
遗憾的是,这些文件夹的命名方式不允许根据文件夹名称使用通配符。

当然,我可以单独列出每个文件,例如:

<include name="ProjA/*.pdb" />
<include name="Foo/*.pdb" />
<!-- ... -->

但是,我在想也许有一种优雅的方式可以指定“复制所有 *.exe 文件和所有 *.pdb 文件,这些文件旁边有一个 *.exe 文件".

您可以使用 <present> 选择器来查找“同级”文件,如下所示:

<copy todir="outdir">
  <fileset dir="Build" includes="**/*.pdb">
    <present targetdir="Build">
      <mapper type="glob" from="*.pdb" to="*.exe" />
    </present>
  </fileset>
  <fileset dir="Build" includes="**/*.exe" />
  <flattenmapper />
</copy>

这只会复制具有匹配 .exe 文件的 .pdb 文件。

为简单起见,请为 exe 文件使用单独的文件集。

仅当您只想复制文件而忽略源中的目录结构时才需要展平映射器。