3

我需要处理一个 zip 存档,它本身包含所有遵循相同结构的 zip 存档:

main.zip/
  foo-1.txt
  foo-1.zip/
    ... 
    tests/
    ...
  bar-1.txt
  bar-1.zip/
    ... 
    tests/
    ...
  bar-2.txt
  bar-2.zip/
    ... 
    tests/
    ...
  foobar-1.txt
  foobar-1.zip/
    ... 
    tests/
    ...

我想将txt文件和tests目录提取到这样的结构中:

 foo/
   1/
     submission.txt
     tests/
 bar/
   1/
     submission.txt
     tests/
   2/
     submission.txt
     tests/
 foobar/
   1/
     submission.txt
     tests/

我设法将目录结构和文本文件放到正确的位置:

<target name="extract submissions">
  <copy todir="${basedir}">
    <zipfileset refid="submissions.zip"/>
<mapper type="regexp" from="(.*)-(.*)\.txt" to="\1/\2/\submission.txt"/>
  </copy>
</target>

但是现在我被困住了如何访问内部拉链内的测试目录。我尝试了一个中间步骤,将内部拉链复制到测试目录应该结束的地方。但是如何在不知道其确切路径的情况下访问 zip 存档的内容?

4

2 回答 2

1

终于找到了纯Ant解决方案:

<target name="extract submissions">
  <copy todir="${basedir}">
    <zipfileset refid="submissions.zip"/>
    <mapper type="regexp" from="(.*)-(.*)\.txt" to="\1/\2/\submission.txt"/>
  </copy>

  <subant genericantfile="${basedir}/build.xml" target="extract submission">
    <dirset dir="${basedir}" includes="*/*"/>
  </subant>
 </target>

<target name="extract submission">
  <copy todir="tests">
    <zipfileset refid="submission.zip"/>
    <mapper type="regexp" from="tests/(.*)" to="\1"/>
  </copy>
</target>

第一个目标提取外部 zip 文件并在每个提取的目录上调用第二个目标。这是通过 subant 实现的。然后第二个目标解压缩一个内部 zip 文件。由于它应用于任何子目录,因此会提取所有内部拉链。

于 2012-10-16T20:43:59.277 回答
0

看起来这是标准 ant 任务不够用的地方。因此,您可以使用自定义任务或脚本解决方法。Javascript 最适合,因为它不需要额外的依赖项,jdk6 就足够了。而且通常只需要java编程知识。加上ant api,必须用ant手册下载。

以下示例查找当前目录中的所有 zip,并将每个 zip 解压缩到tests在 zip 文件目录中创建的目录中。

  <target name="un2">
    <fileset dir="." includes="**/*.zip" id="zipset" />
    <script language="javascript">
      it = project.getReference("zipset").iterator();
      while (it.hasNext()) {
        zipFile = new java.io.File(it.next());
        java.lang.System.out.println(zipFile.getParent());
        unzipTask = project.createTask("unzip");
        unzipTask.setSrc(zipFile);
        dest = new java.io.File(zipFile.getParent(), "tests")
        unzipTask.setDest(dest);
        unzipTask.execute();
      }
    </script>
  </target>
于 2012-10-06T08:42:04.990 回答