Ant распаковывает задачу и извлекает только файлы на основе другого каталога - PullRequest
4 голосов
/ 18 октября 2011

У меня есть zip-файл и, отдельно, каталог, содержащий некоторые файлы. Из zip-файла я хотел бы извлечь только те файлы, которые существуют в каталоге (выполняя преобразование имени файла для файлов по мере их извлечения ... в основном я делаю резервные копии этих файлов).

Нет проблем с тем, чтобы сделать что-то похожее с , у которого есть набор файлов с элементом , но мне кажется, что он не работает с unzip:

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

2 голосов
/ 19 октября 2011

Мне удалось решить мою проблему, "подделав" селектор , который можно использовать в .Вот как это делается:

Сначала я использовал 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", чтобы в файле всегда был хотя бы одинлиния.Это важно из-за нашего следующего шага, где мы используем это как 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>
1 голос
/ 07 января 2014

Добавление здесь, если кому-то нужно изменить структуру каталогов при извлечении.Я потратил так много времени, пытаясь заставить это работать.Задача 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>
1 голос
/ 18 октября 2011

Вы можете попробовать вызвать команду 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.

...