4

我有一个 zip 文件,另外还有一个包含一些文件的目录。从 zip 文件中,我只想提取目录中存在的那些文件(在提取文件时对文件执行文件名转换......基本上,我正在备份这些文件)。

对具有带有 <present> 元素的文件集的 <copy> 执行类似操作没有问题,但解压缩似乎对我不起作用:

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

有没有人做过这样的事情?这是蚂蚁 1.8.0。谢谢!

4

3 回答 3

2

我能够通过“伪造”可以在 <copy> 中使用的 <present> 选择器来解决我的问题。就是这样:

首先,我使用 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" />

我把那个“nooop”条目放在那里,这样文件总是至少有一行。这很重要,因为我们下一步将其用作包含文件。如果包含文件为空,Ant 将其解释为“允许任何内容”……但我们要确保空列表不会导致从 zip 中提取任何内容。

最后一步是使用我们上面的临时文件作为包含文件从 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>
于 2011-10-19T16:38:10.850 回答
1

您可以尝试通过exec任务调用 unzip 命令。
我在 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参数,您的原始文件(存储在文件夹中)将被重命名 - 将附加波浪符号。你会得到两组文件——从存档文件和旧的原始文件中提取。之后,您可以在任务
的帮助下重命名文件。move

于 2011-10-18T05:48:28.393 回答
1

如果有人需要在提取时更改目录结构,请在此处添加此内容。我花了很多时间试图让这个工作。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>
于 2014-01-07T18:30:46.867 回答