Domanda

Ho un file zip e, separatamente, una directory che contiene alcuni file. Dal file zip che vorrei estrarre solo i file presenti nella directory (che svolgono una trasformazione nome di file sui file come stanno essendo extracted..basically, sto facendo copie di backup di tali file).

Non c'è nessun problema a fare qualcosa di simile con un che ha un set di file con un elemento, ma non sembra funzionare per me 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>

Qualcuno ha fatto qualcosa di simile prima d'ora? Questo è Ant 1.8.0. Grazie!

È stato utile?

Soluzione

Sono riuscito a risolvere il mio problema dal selettore "finta" che può essere utilizzato in . Ecco come:

Per prima cosa ho usato pathconvert per creare una lista dei file nella mia cartella:

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

Avviso l'utente di una mappa per avere la lista be percorsi relativi invece di percorsi assoluti. In più, il delimitatore è un ritorno a capo.

Poi questa lista viene scritto in un file:

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

ho messo quella voce "nooop" in là in modo che il file ha sempre almeno una riga. Questo è importante perché il nostro prossimo passo in cui usiamo questo come un includesfile. Se l'includesfile è vuoto, interpreta Ant che come "sovrapporre niente" ... ma vogliamo fare in modo che una lista vuota risultati in nulla ottenere estratti dal zip.

L'ultimo passo è quello di estratto della zip utilizzando il nostro file temporaneo dall'alto come file include. Il globmapper rinomina i file su di estrazione, ai nomi di backup appropriata:

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

Altri suggerimenti

Si può provare a chiamare comando unzip via exec compito.
Il campione che ho controllato su Windows che l'aggiornamento solo i file cambiati in 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>

Se si vuole rimanere i file originali è possibile utilizzare questo comando:

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

In caso utilizzando -B parametro i file originali (memorizzato nella cartella) sarà rinominata - il simbolo tilde verrà aggiunto. È possibile ottenere due set di file - estratti da archivio e vecchi file originali.
Dopo di che è possibile rinominare i file con l'aiuto di move compito.

L'aggiunta di questo qui nel caso in cui qualcuno ha bisogno di cambiare la struttura di directory su estrazione. Ho passato così tanto cercando di fare questo lavoro. task Ant Unzip accetta 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top