【问题标题】:Ant Nested Loop蚂蚁嵌套循环
【发布时间】:2012-08-02 01:58:53
【问题描述】:

我有两个 txt 文件: File1.txt - 包含 src 目录列表;和 File2.txt - 包含 dest 目录列表。我需要使用从 src 目录到 dest 目录的循环来进行复制。

File1.txt(SVN可怕的结构)

abcBIN
abcBIN/fdPro
...so on

File2.txt(LINUX结构)

apps/xxx/yyy/bin/abc
apps/xxx/yyy/bin/abc/fdpro
...so on

我需要将 abcBIN 文件目录复制到 apps/xxx/yyy/bin/abc 等。一对一映射。

<project xmlns:ac="antlib:net.sf.antcontrib">

<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
   <classpath>
      <pathelement location="path-to-ant-contrib.jar"/>
   </classpath>
</taskdef>

<loadfile property="file1" srcfile="File1.txt"/> 
<loadfile property="file2" srcfile="File2.txt"/>

<ac:for param="i" list="${file1}">
    <ac:for param="j" list="${file2}"> 
        <sequential>
           <echo>@{i}@{j}</echo>
           <echo>copying....</echo>

           <property name="src.dir" value="/home/name/svn_repo/dir" />
           <property name="dest.dir" value="/home/name/mapp" /> 
           <copy todir="${dest.dir}/@{j}">
              <fileset dir="${src.dir}/@{i}"> 
              </fileset>
           </copy>     
        </sequential>
     </ac:for>
</ac:for>

</project>

但它不起作用。

我收到一个错误:

ac:for doesn't support the nested "for" element

我不能使用 UNIX shell 或 Perl。必须在 Ant 中完成。

如果您对 Ant 中的嵌套循环有更好的了解,请告诉我。

【问题讨论】:

  • 我需要复制(file.txt 目录到 file2.txt 目录)例如 abcBIN 文件目录到 apps/xxx/yyy/bin/abc 等等。一对一映射。
  • 如果你真的想这样做,你需要把第二个&lt;for&gt;放在&lt;sequential&gt;里面,你还需要把&lt;echo&gt;.....&lt;/copy&gt;部分放在第二个里面的&lt;sequential&gt;里面&lt;for&gt;.
  • coolcfan,如果我使用你提到的逻辑。它不适用于一对一映射。例如来自 src 的一行,然后来自 dest dir 的一行
  • @ShwetaChandrakar 您可以发布您的解决方案,以便其他人可以从中受益。
  • @ShwetaChandrakar 我需要知道这个解决方案.. 谢谢

标签: ant copy ant-contrib


【解决方案1】:

@PulakAgrawal:我使用冒号作为行分隔符将两个文本文件合并为一个文件,魔法开始了:)

例如src 路径:目标路径

     <loadfile property="allfiles" srcFile="mapping"/>

      <ac:for list="${allfiles}" param="line" delimiter="${line.separator}">

     <ac:sequential>

            <ac:propertyregex property="from" input="@{line}" regexp="(.*):(.*)" select="\1" override="true"/>

            <ac:propertyregex property="to" input="@{line}" regexp="(.*):(.*)" select="\2" override="true"/>

            <echo>Copying dir ${from} to ${to} ...</echo>

            <property name="src.dir" value="." /> <property name="dest.dir" value="." />

            <copy todir="${dest.dir}/${to}">     <fileset dir="${src.dir}/${from}">  </fileset> </copy>

     </ac:sequential>

     </ac:for>

【讨论】:

  • 谢谢;您可能希望将此标记为答案,以便其他人受益。
  • 虽然这行得通..我称之为黑客。 @FailedDev 怎么说?你能想出一个更清洁的解决方案吗?
  • @PulakAgrawal:嗯,这不是黑客攻击。这是我在 ANT 中使用的内置命令。实际的文本文件是单个文件。为了我自己的方便,我确实把它分开了。然后我想到了使用原版。
  • @PulakAgrawal:如果您仍然认为它没有用,那么我很乐意将其从论坛中删除。这就是我之前没有发布答案的原因。当你要求我这样做时,我就这样做了。我是 ANT 的新手。我可能没有给出最好的。
  • :) 请不要删除任何内容。这是一个有效的答案,因为它完成了这项工作。这将对许多人有用。至少我把它保存在我最喜欢的列表中。以我的经验,我可以告诉你已经在 ANT 开发人员中排名前 10%,所以不用担心。如果你不喜欢“hack”这个词,好吧,但我仍然认为它不是一个干净的解决方案,因为我们正在从操作系统处理,然后到一个文件(其中包含 LS 的输出??),然后回到操作系统做副本。如果我能想出一个更干净的,我会自己回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多