Tarea de descremisión de hormigas y solo extraer archivos basados ​​en otro directorio

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

  •  22-10-2019
  •  | 
  •  

Pregunta

Tengo un archivo zip y, por separado, un directorio que contiene algunos archivos. Desde el archivo zip me gustaría extraer solo aquellos archivos que existen en el directorio (realizando una transformación del nombre de archivo en los archivos a medida que se extraen ... básicamente, estoy haciendo copias de seguridad de esos archivos).

No hay ningún problema en hacer algo similar con unu003Ccopy> que tiene un conjunto de archivos con unu003Cpresent> Elemento, pero no parece estar funcionando para mí con 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>

¿Alguien ha hecho algo como esto antes? Esta es Ant 1.8.0. ¡Gracias!

¿Fue útil?

Solución

Pude resolver mi problema "fingiendo" elu003Cpresent> selector que se puede usar enu003Ccopy> . Así es cómo:

Primero utilicé PathConvert para crear una lista de los archivos en mi carpeta:

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

Observe que el usuario de un mapa que la lista sea rutas relativas en lugar de rutas absolutas. Además, el delimitador es una nueva línea.

Luego, esta lista se escribe en un archivo:

    <echo file="${props.tmp.file}" message="~~~~noop~~~~&#xA;${extract.list}" append="false" />

Puse esa entrada "Noop" allí para que el archivo siempre tenga al menos una línea. Esto es importante debido a nuestro próximo paso en el que usamos esto como un archivo INCUENTADO. Si el FILE INCENDIDO está vacío, Ant interpreta que "Permitir cualquier cosa" ... pero queremos asegurarnos de que una lista vacía resulte en nada extraído de la zip.

El último paso es extraer de la zip usando nuestro archivo TEMP desde arriba como un archivo incluye. The GlobMapper renombra los archivos a la extracción, a los nombres de copia de seguridad apropiados:

    <unzip src="${extract.archive}" dest="${extract.dest.dir}" overwrite="true">
        <patternset>
            <includesfile name="${props.tmp.file}" />
        </patternset>
        <globmapper from="*" to="*.${backup.suffix}" />
    </unzip>

Otros consejos

Puede intentar llamar al comando unzip a través de ejecución tarea.
La muestra que verifiqué en Windows que actualizara solo cambió los archivos en 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>

Si desea mantener sus archivos originales, puede usar este comando:

<arg line="/c unzip -foB ${src.folder}${zip.file_name}"/>

En caso de usar -B Parámetro Se renombrarán sus archivos originales (almacenados en la carpeta): se agregará el símbolo de Tilde. Obtiene dos conjuntos de archivos, extraídos del archivo y archivos originales antiguos.
Después de eso, puede cambiar el nombre de los archivos con la ayuda de move tarea.

Agregar esto aquí en caso de que alguien necesite cambiar la estructura del directorio en la extracción. He pasado mucho tratando de hacer que esto funcione. Tarea de descremisión de hormigas acepta 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top