题
我有一个zip文件,分别是包含某些文件的目录。从zip文件中,我想仅提取目录中存在的那些文件(在提取文件时在文件上执行文件名转换。.基本上,我正在对这些文件进行备份)。
做类似的事情没有问题u003Ccopy>它的文件集带有一个u003Cpresent>元素,但似乎对我没有拉链并不适合我:
<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="
">
<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”条目放在其中,以便该文件始终具有至少一行。这很重要,因为我们下一步将其用作包含的file。如果includefile是空的,则将蚂蚁解释为“允许任何东西” ...但是我们要确保空列表从邮政编码中提取任何东西。
最后一步是使用上面的临时文件从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>
其他提示
您可以尝试通过 执行 任务。
我在窗口上检查的示例刷新仅更改了文件 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符号。您会得到两组文件 - 从存档和旧的原始文件中提取。
之后,您可以在 move
任务。
如果有人需要更改提取目录结构,请在此处添加此内容。我花了很多时间尝试使它起作用。蚂蚁解压缩任务接受 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>
不隶属于 StackOverflow