Задача повторного зрелища муравья и только извлечение файлов на основе другого каталога

StackOverflow https://stackoverflow.com/questions/7802142

  •  22-10-2019
  •  | 
  •  

Вопрос

У меня есть 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="&#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», чтобы в файле всегда была хотя бы одна строка. Это важно из -за нашего следующего шага, где мы используем это в качестве 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top