Ant: найти путь к файлу в каталоге - PullRequest
8 голосов
/ 20 декабря 2011

Я хочу найти путь к файлу в каталоге (аналогично команде unix 'find' или команде 'which', но мне нужно, чтобы он работал независимо от платформы) и сохранить его как свойство.

Пытался использовать задачу whichresource ant, но она не справляется с задачей (я думаю, что она полезна только для просмотра jar-файлов).

Я бы предпочел, чтобы это был чистый муравей ине писать свою собственную задачу или использовать стороннее расширение.

Обратите внимание, что в пути может быть несколько экземпляров файла с этим именем - я хочу, чтобы он возвращал только первый экземпляр (или, по крайней мере,Я хочу иметь возможность выбрать только один).

Есть предложения?

Ответы [ 2 ]

24 голосов
/ 20 декабря 2011

Можно использовать селектор ресурсов first. Например, чтобы найти файл с именем a.jar где-нибудь в каталоге jars:

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

Если нет подходящих файлов, ничего не будет отображено, в противном случае вы получите путь к первому совпадению.

7 голосов
/ 20 декабря 2011

Вот пример, который выбирает первый соответствующий файл. Логика следующая:

  • найти все совпадения, используя набор файлов .
  • используя 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>
...