Ant:查找目录中文件的路径

yon*_*nix 8 ant file path find

我想在目录中找到文件的路径(类似于unix'find'命令或'which'命令,但我需要它与平台无关)并将其保存为属性.

试图使用whichresourceant任务,但它没有做到这一点(我认为它只适用于查看jar文件).

我更愿意,如果它是纯粹的蚂蚁,而不是编写我自己的任务或使用第三方扩展.

请注意,路径中可能存在该名称的文件的多个实例 - 我希望它只返回第一个实例(或者至少我希望只能选择一个).

有什么建议?

mar*_*ton 24

一种可能性是使用first资源选择器.例如,要a.jar在目录下找到名为somewhere 的文件jars:

<first id="first">
    <fileset dir="jars" includes="**/a.jar" />
</first>
<echo message="${toString:first}" />
Run Code Online (Sandbox Code Playgroud)

如果没有匹配的文件,则不会回显任何内容,否则您将获得第一个匹配的路径.

  • 这只是一种"字符串化"Ant类型的方法.请参见http://ant.apache.org/manual/properties.html#toString (3认同)

sud*_*ode 7

以下是选择第一个匹配文件的示例.逻辑如下:

  • 使用文件集查找所有匹配项.
  • 使用pathconvert,将结果存储在属性中,使用行分隔符分隔每个匹配的文件.
  • 使用头部过滤器匹配第一个匹配的文件.

该功能封装在macrodef中以实现可重用性.

<project default="test">

  <target name="test">
    <find dir="test" name="*" property="match.1"/>
    <echo message="found: ${match.1}"/>
    <find dir="test" name="*.html" property="match.2"/>
    <echo message="found: ${match.2}"/>
  </target>

  <macrodef name="find">
    <attribute name="dir"/>
    <attribute name="name"/>
    <attribute name="property"/>
    <sequential>
      <pathconvert property="@{property}.matches" pathsep="${line.separator}">
        <fileset dir="@{dir}">
          <include name="@{name}"/>
        </fileset>
      </pathconvert>
      <loadresource property="@{property}">
        <string value="${@{property}.matches}"/>
        <filterchain>
          <headfilter lines="1"/>
        </filterchain>
      </loadresource>
    </sequential>
  </macrodef>

</project>
Run Code Online (Sandbox Code Playgroud)