我需要处理一个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存档的内容?
答案 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>