我有一个zip文件,另外还有一个包含一些文件的目录。从zip文件中我只想提取目录中存在的那些文件(在文件被提取时对文件执行文件名转换。基本上,我正在备份这些文件)。
使用< copy>执行类似的操作是没有问题的具有< present>的文件集元素,但解压缩似乎对我不起作用:
<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。谢谢!
答案 0 :(得分:2)
我能够通过“伪造”&lt; present&gt;来解决我的问题。可以在&lt; copy&gt;中使用的选择器。方法如下:
首先,我使用pathconvert创建文件夹中的文件列表:
<pathconvert property="extract.list" pathsep="
">
<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~~~~
${extract.list}" append="false" />
我把那个“nooop”条目放在那里,这样文件总是至少有一行。这很重要,因为我们将下一步用作包含文件。如果includesfile为空,则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>
答案 1 :(得分:1)
您可以尝试通过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
参数,您的原始文件(存储在文件夹中)将被重命名 - 将附加波形符号。您将获得两组文件 - 从存档和旧原始文件中提取。
之后,您可以在move
任务的帮助下重命名文件。
答案 2 :(得分: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>