2011-12-20 83 views
7

我想在目录中找到文件的路径(类似于unix的'find'命令或'which'命令,但我需要它工作于独立于平台的)并将其保存为属性。Ant:在一个目录中查找文件的路径

试图使用whichresource ant任务,但它没有办法(我认为这只适用于查看jar文件)。

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

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

有什么建议吗?

回答

21

一种可能性是使用first资源选择器。例如,要查找一个名为a.jar文件目录下jars地方:

<first id="first"> 
    <fileset dir="jars" includes="**/a.jar" /> 
</first> 
<echo message="${toString:first}" /> 

如果没有匹配的文件,什么都不会回应,否则你会得到的路径,第一场比赛。

+0

+1比我的更整洁:) – sudocode 2011-12-20 15:11:04

+0

太棒了!这很好!你能解释一下'toString:'thingie是什么吗? – yonix 2011-12-20 16:45:47

+3

这只是一种“串化”Ant类型的方法。请参阅http://ant.apache.org/manual/properties.html#toString – 2011-12-20 16:50:33

7

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

  • 查找所有匹配的使用fileset
  • 使用pathconvert,将结果存储在属性中,用行分隔符分隔每个匹配文件。
  • 使用head filter来匹配第一个匹配的文件。

该功能被封装在一个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> 
+0

macrodef很酷 - 为此+1 :) – yonix 2011-12-20 16:49:07