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内のtestsディレクトリにアクセスする方法に行き詰まっています。テストディレクトリが終了する場所に内部のzipをコピーする中間ステップを試しました。しかし、正確なパスを知らずに 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 ファイルを抽出し、抽出された各ディレクトリで 2 番目のターゲットを呼び出します。これはサブアントによって達成されます。次に、2 番目のターゲットが内部の zip ファイルを解凍します。任意のサブディレクトリに適用されるため、内部のすべての zip が抽出されます。

于 2012-10-16T20:43:59.277 に答える
0

これは、標準的なアリのタスクでは不十分な場所のようです。したがって、カスタムタスクまたはスクリプトの回避策にたどり着きます。Javascriptは追加の依存関係を必要としないため、最適です。jdk6で十分です。そして通常、Javaプログラミングの知識だけが必要です。さらに、 antapi。antマニュアルと一緒にダウンロードする必要があります。

tests次の例では、現在のディレクトリ内のすべてのzipを検索し、各zipを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 に答える