【问题标题】:Extracting nested zip archives with Ant使用 Ant 提取嵌套的 zip 档案
【发布时间】:2012-10-17 04:43:59
【问题描述】:

我需要处理一个 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 复制到测试目录应该结束的位置。但是如何在不知道其确切路径的情况下访问 zip 存档的内容?

【问题讨论】:

    标签: ant unzip


    【解决方案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 文件。由于它应用在任何子目录中,因此将提取所有内部拉链。

    【讨论】:

      【解决方案2】:

      看起来这是一个标准 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>
      

      【讨论】:

        猜你喜欢
        • 2020-07-03
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多