Используя ant, переименовать каталог, не зная полного пути?

Учитывая zip-файл с неизвестным каталогом, как я могу переименовать или переместить этот каталог на нормализованный путь?

<!-- Going to fetch some stuff -->
<target name="get.remote">

    <!-- Get the zipfile -->
    <get src="http://myhost.com/package.zip"
         dest="package.zip"/>

    <!-- Unzip the file -->
    <unzip src="package.zip"
           dest="./"/>

    <!-- Now there is a package-3d28djh3 directory.  The part after package- is
         a hash and cannot be known ahead of time -->

    <!-- Remove the zipfile -->
    <delete file="package.zip"/>

    <!-- Now we need to rename "package-3d28djh3" to "package".  My best attempt
         is below, but it just moves package-3d28djh3 into package instead of
         renaming the directory. -->

    <!-- Make a new home for the contents. -->
    <mkdir dir="package" />

    <!-- Move the contents -->
    <move todir="package/">
      <fileset dir=".">
        <include name="package-*/*"/>
      </fileset>
    </move>

</target>

Я не большой пользователь муравьев, любая информация будет полезна.

Большое спасибо, - Мэтт


person mixonic    schedule 06.04.2010    source источник


Ответы (2)


Это будет работать только до тех пор, пока dirset возвращает только 1 элемент.

<project name="Test rename" basedir=".">

  <target name="rename">
    <path id="package_name">
      <dirset dir=".">
        <include name="package-*"/>
      </dirset>
    </path>
    <property name="pkg-name" refid="package_name" />
    <echo message="renaming ${pkg-name} to package" />
    <move file="${pkg-name}" tofile="package" />
  </target>

</project>
person mamboking    schedule 06.04.2010
comment
Святое дерьмо, мамбоксинг, который сработал. Я понятия не имею, какой здесь должен быть логический поток... мы создаем путь с помощью dirset, а затем сохраняем его правильно, чтобы мы могли получить доступ к его строковому значению в движении? Приятно идти. - person mixonic; 06.04.2010
comment
Drat, и, конечно, это не будет работать в макросе, потому что он использует свойства. @#$@( муравей. - person mixonic; 07.04.2010
comment
я знаю, что прошло 2 года, и это определенно работает, но я хотел бы знать, почему это работает и почему нет более интуитивного подхода к простому переименованию каталога из fixed-prefix-* в someConstantName - person radai; 08.09.2012

Если в каталоге package-3d28djh3 нет подкаталогов (или как там он называется после того, как вы его распаковали), вы можете использовать

<move todir="package" flatten="true" />
  <fileset dir=".">
    <include name="package-*/*"/>
  </fileset>
</move>

В противном случае используйте средство сопоставления регулярных выражений для задачи перемещения и избавьтесь от каталога package-xxx:

<move todir="package">
  <fileset dir=".">
    <include name="package-*/*"/>
  </fileset>
  <mapper type="regexp" from="^package-.*/(.*)" to="\1"/>
</move>
person pitpod    schedule 06.04.2010
comment
Привет питпод! Черт, это регулярное выражение почти все. Однако это не рекурсивно, копируются только каталоги, а не их содержимое. У меня есть дерево каталогов, возможно, 6 уровней в глубину для перемещения. Очевидно, что ход муравья не просто отображается на mv. Ад. - person mixonic; 06.04.2010