【问题标题】:Using ant, rename a directory without knowing the full path?使用ant,在不知道完整路径的情况下重命名目录?
【发布时间】: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>

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

非常感谢,-马特

【问题讨论】:

    标签: java ant zip rename move


    【解决方案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 上。地狱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2014-05-08
    • 2014-12-06
    相关资源
    最近更新 更多