Ant tâche Décompressez et uniquement les fichiers d'extraction basé sur un autre répertoire

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

  •  22-10-2019
  •  | 
  •  

Question

Je dispose d'un fichier zip et, séparément, un répertoire contenant des fichiers. A partir du fichier zip que je voudrais extraire uniquement les fichiers qui existent dans le répertoire (effectuer une transformation de nom de fichier sur les fichiers comme ils sont extracted..basically, je fais des sauvegardes de ces fichiers).

Il n'y a pas de problème à faire quelque chose de similaire avec une qui a un ensemble de fichiers avec un élément , mais il ne semble pas fonctionner pour moi avec Décompressez:

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

Quelqu'un at-il fait quelque chose comme ceci avant? Ceci est Ant 1.8.0. Merci!

Était-ce utile?

La solution

J'ai pu résoudre mon problème par « truquer » le sélecteur qui peut être utilisé dans . Voici comment:

D'abord, j'utilisé pathconvert pour créer une liste des fichiers dans mon dossier:

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

Notez que l'utilisateur d'une carte pour la liste soit des chemins relatifs au lieu des chemins absolus. De plus, le séparateur est une nouvelle ligne.

Ensuite, cette liste est écrit dans un fichier:

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

Je mets cette entrée « nooop » là-bas pour que le fichier a toujours au moins une ligne. Ceci est important en raison de notre prochaine étape où nous utilisons cela comme une includesfile. Si le includesfile est vide, Ant interprète que « permettre quoi que ce soit » ... mais nous voulons nous assurer que les résultats de la liste un vide en rien s'extrait du zip.

La dernière étape consiste à extraire du zip en utilisant notre fichier temporaire en haut comme fichier comprend. Le globmapper renomme les fichiers lors de l'extraction, les noms de sauvegarde appropriés:

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

Autres conseils

Vous pouvez essayer d'appeler unzip via exec .
L'exemple que j'ai vérifié sur Windows rafraîchissement uniquement les fichiers modifiés dans 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 vous voulez rester vos fichiers d'origine, vous pouvez utiliser cette commande:

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

Dans le cas en utilisant le paramètre -B vos fichiers originaux (stockés dans le dossier) sera renommé - le symbole tilde sera ajouté. Vous obtenez deux ensembles de fichiers - extraits d'archives et les anciens fichiers d'origine.
Après cela, vous pouvez renommer les fichiers à l'aide de la tâche move .

L'ajout de ce ici au cas où quelqu'un a besoin de changer la structure de répertoire sur l'extraction. J'ai passé tellement d'essayer de faire ce travail. Ant tâche Décompressez accepte 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top