2010-11-18 15 views
7

Je souhaite créer une cible Ant qui copie les fichiers d'un répertoire dans un répertoire de destination avec la même structure de dossiers, plus un autre sous-dossier ajouté.Utilisation du mappeur et du groupe de fichiers pour copier des fichiers dans un sous-répertoire différent?

Par exemple, la source est:

a/b/c/foo.pdf 
d/e/f/bar.pdf 

Je veux que la destination soit:

a/b/c/x/foo.pdf 
d/e/f/x/foo.pdf 

Voici mon objectif jusqu'à présent, mais il ne semble pas faire quoi que ce soit:

<copy todir="${dest.dir}"> 
    <fileset dir="${src.dir}" casesensitive="yes"> 
     <include name="**${file.separator}foo.pdf" /> 
    </fileset>  
    <mapper type="glob" 
      from="foo.pdf" to="x${file.separator}foo.pdf" />    
</copy> 

Que manque-t-il?

Répondre

11

Vous pouvez utiliser un regexp Mapper:

<copy todir="${dest.dir}"> 
    <fileset dir="${src.dir}" casesensitive="yes"> 
     <include name="**/*.pdf"/> 
    </fileset> 
    <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" /> 
</copy> 

Je l'ai utilisé file.separators codées en dur pour raccourcir. Fondamentalement, vous divisez le chemin vers le fichier d'entrée (à partir de) dans le répertoire et le nom de fichier (capture \1 et \2), puis insérez l'élément supplémentaire \x entre eux (à).

Je ne comprends pas très bien votre exemple: il semble que vous vouliez faire correspondre 'bar.pdf' et le renommer 'foo.pdf', ainsi que modifier le répertoire. Si vous devez faire, vous pourriez envisager enchaînant quelques cartographes regexp plus simples, plutôt que d'essayer de faire cuire un complexe:

<copy todir="${dest.dir}"> 
    <fileset dir="${src.dir}" casesensitive="yes"> 
     <include name="**/*.pdf"/> 
    </fileset> 
    <chainedmapper> 
     <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" /> 
     <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/foo.pdf" /> 
    </chainedmapper> 
</copy> 

Lorsque vous utilisez un glob mappeur, vous devez spécifier un caractère générique * dans la du champ:

vers et depuis sont nécessaires et définir des modèles qui peuvent contenir au plus un *. Pour chaque fichier source qui correspond au modèle , un nom de fichier cible sera créé à partir du pour que le motif soit remplacé par * dans le motif à utiliser avec le texte que correspond au * dans le modèle from. Les noms de fichiers source qui ne correspondent pas au modèle seront ignorés.

donc quelque chose comme ça pourrait fonctionner:

<mapper type="glob" from="*/foo.pdf" to="*/x/foo.pdf" /> 
+0

Désolé, j'obscurcissent mes noms de fichiers au point de confusion. Ils auraient tous deux dû être renommés foo.pdf. En tout cas, le premier bloc de code l'a fait pour moi. Je vous remercie! Des idées sur pourquoi mon mappeur glob était faux? – GJTorikian

+0

@GJTorikian - J'ai ajouté une note sur le mappeur glob, hth. –