Ant compito unzip e file solo estrazione sulla base di un'altra directory
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
<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!
Soluzione
Sono riuscito a risolvere il mio problema dal selettore "finta"
Per prima cosa ho usato pathconvert per creare una lista dei file nella mia cartella:
<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>
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~~~~
${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>