Задача повторного зрелища муравья и только извлечение файлов на основе другого каталога
Вопрос
У меня есть 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. Если включение FILE пустое, ANT интерпретирует, что «разрешить что -нибудь» ... но мы хотим убедиться, что пустой список не приводит к тому, что ничего не извлекается из Zip.
Последний шаг - извлечь из ZIP, используя наш Temp File с вышеупомянутого файла. 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 через исполнительный задача.
Образец, который я проверил в 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. Вы получаете два набора файлов - извлечены из архива и старых оригинальных файлов.
После этого вы можете переименовать файлы с помощью 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>