ANT UNZIPタスクと別のディレクトリに基づいてファイルのみを抽出する

StackOverflow https://stackoverflow.com/questions/7802142

  •  22-10-2019
  •  | 
  •  

質問

zipファイルと、いくつかのファイルを含むディレクトリがあります。 zipファイルから、ディレクトリに存在するファイルのみを抽出したい(ファイルが抽出されているときにファイル変換を実行します。基本的に、それらのファイルのバックアップを作成します)。

aと同様のことをするのに問題はありませんu003Ccopy>aでファイルセットがありますu003Cpresent>要素ですが、それは私にとってUnzipで働いていないようです:

<unzip src="${cur.srcdir.live}" dest="${cur.srcdir.archive-files.dir}" overwrite="true">
    <fileset dir=".">
        <present present="both" targetdir="${cur.srcdir}" />
        <type type="file" />
    </fileset>
    <globmapper from="*" to="*.${backup.suffix}" />
</unzip>

誰かが以前にこのようなことをしたことがありますか?これはANT 1.8.0です。ありがとう!

役に立ちましたか?

解決

私は自分の問題を「偽造」することによって解決することができましたu003Cpresent>で使用できるセレクターu003Ccopy>。方法は次のとおりです。

最初に、PathConvertを使用して、フォルダー内のファイルのリストを作成しました。

    <pathconvert property="extract.list" pathsep="&#xA;">
        <path>
            <fileset dir="${extract.src.dir}" includes="${extract.src.dir.relpath}">
                <type type="file" />
            </fileset>
        </path>
        <map from="${extract.src.dir}\" to="" />
    </pathconvert>

マップのユーザーが、リストを絶対パスの代わりに相対パスにするように注意してください。さらに、デリミッターは新しいラインです。

その後、このリストはファイルに書き込まれます。

    <echo file="${props.tmp.file}" message="~~~~noop~~~~&#xA;${extract.list}" append="false" />

ファイルには常に少なくとも1つの行があるように、その「ノープ」エントリをそこに入れました。これは、これを含むファイルとして使用する次のステップのために重要です。 includefileが空の場合、Antは「何でも許可」と解釈します...しかし、空のリストがzipから抽出されないことを確認したいと思います。

最後のステップは、上記のTEMPファイルを含むファイルとしてZIPから抽出することです。 GlobMapperは、抽出時にファイルを適切なバックアップ名に変更します。

    <unzip src="${extract.archive}" dest="${extract.dest.dir}" overwrite="true">
        <patternset>
            <includesfile name="${props.tmp.file}" />
        </patternset>
        <globmapper from="*" to="*.${backup.suffix}" />
    </unzip>

他のヒント

unzipコマンドを介して呼び出すことができます exec 仕事。
Windowsでチェックしたサンプルは、でファイルを変更しただけです dest.folder:

<property name="zip.file_name" value="Archive.zip"/>
<property name="src.folder" value="d:\"/>
<property name="dest.folder" value="d:\55"/>

<target name="unzip">
    <echo>unzip -fo ${src.folder}${zip.file_name}</echo>
    <exec dir="${dest.folder}" executable="cmd.exe" output="${src.folder}operation_result.txt">

        <arg line="/c unzip -fo ${src.folder}${zip.file_name}"/>
    </exec>
</target>

元のファイルのままにしたい場合は、このコマンドを使用できます。

<arg line="/c unzip -foB ${src.folder}${zip.file_name}"/>

使用する場合 -B パラメーター元のファイル(フォルダーに保存)の名前が変更されます - Tildeシンボルが追加されます。アーカイブと古いオリジナルファイルから抽出された2セットのファイルを取得します。
その後、あなたはの助けを借りてファイルの名前を変更することができます move 仕事。

誰かが抽出時にディレクトリ構造を変更する必要がある場合に備えて、これをここに追加します。私はこれを機能させようとしてたくさん費やしました。 Ant Unzipタスクが受け入れます cutdirsmapper.

<unzip dest="${build.dir}/packages">
    <fileset dir="${src.dir}/packages" includes="*.pkg" />
    <!-- Exctract build folder contents also moving one level up. -->       
    <cutdirsmapper dirs="1" />
    <patternset>
        <include name="build/" />
    </patternset>
</unzip>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top