Ant распаковывает задачу и извлекает только файлы на основе другого каталога
У меня есть zip-файл и, отдельно, каталог, содержащий некоторые файлы. Из zip-файла я хотел бы извлечь только те файлы, которые существуют в каталоге (выполняя преобразование имени файла для файлов по мере их извлечения... в основном я делаю резервные копии этих файлов).
Нет проблем с тем, чтобы сделать что-то похожее с
<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. Спасибо!
3 ответа
Мне удалось решить мою проблему, "подделав" селектор
Сначала я использовал 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", чтобы в файле всегда была хотя бы одна строка. Это важно из-за нашего следующего шага, где мы используем это как include-файл. Если include-файл пуст, 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>
Добавление этого здесь на случай, если кому-то нужно изменить структуру каталогов при извлечении. Я потратил так много времени, пытаясь заставить это работать. Задача 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>
Вы можете попробовать вызвать команду unzip через exec task.
Образец, который я проверял в 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
задача.