使用ant,在不知道完整路径的情况下重命名目录?

Posted

技术标签:

【中文标题】使用ant,在不知道完整路径的情况下重命名目录?【英文标题】:Using ant, rename a directory without knowing the full path? 【发布时间】:2011-02-04 22:25:53 【问题描述】:

给定一个包含未知目录的 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>

我不是蚂蚁用户,任何见解都会有所帮助。

非常感谢,-马特

【问题讨论】:

【参考方案1】:

这只有在 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>

【讨论】:

天哪,这行得通。我不知道应该有什么逻辑流程...我们用 dirset 创建一个路径,然后将它正确地存储起来,以便我们可以在 move 中访问它的字符串值?好样的。 Drat,当然这在宏中不起作用,因为它使用属性。 @#$​​@(蚂蚁。 我知道它已经 2 年了,这绝对有效,但我很想知道为什么它有效,以及为什么没有更直观的方法来简单地从“fixed-prefix-*”重命名目录到“someConstantName”【参考方案2】:

如果 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>

【讨论】:

你好!该死的正则表达式几乎就是它。它不是递归的,只复制目录而不是它们的内容。我有一个目录树可能有 6 层要移动。显然,ant 的“move”并不是简单的映射到 mv 上。地狱。

以上是关于使用ant,在不知道完整路径的情况下重命名目录?的主要内容,如果未能解决你的问题,请参考以下文章

在不破坏现有迁移的情况下重命名 Django 模型

如何在不破坏 Subversion 历史的情况下重命名 Java 包?

如何在不删除或移动mysql中的表的情况下重命名数据库? [复制]

如何在不破坏文件的情况下重命名xcode项目中的文件夹名称

如何在不重新加载 HTML 页面的情况下重定向锚标记链接?

如何在不更改web.config文件中的URL的情况下重定向域?