使用Ant提取嵌套的zip存档

时间:2012-10-06 01:58:19

标签: ant unzip

我需要处理一个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>

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

2 个答案:

答案 0 :(得分: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文件。由于它应用于任何子目录,因此将提取所有内部拉链。

答案 1 :(得分:0)

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

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

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