2010-11-18 12 views
7

Quiero crear un objetivo Ant que copie archivos en un directorio a un directorio de destino con la misma estructura de carpetas, más una subcarpeta más añadida.¿Usando mapper & fileset para copiar archivos en un subdirectorio diferente?

Por ejemplo, la fuente es:

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

que desea que el destino sea:

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

Aquí es mi destino hasta este momento, pero no parece estar haciendo nada:

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

¿Qué me falta?

Respuesta

11

Se puede usar un asignador de regexp:

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

He usado file.separators no modificables para acortar. Básicamente, divide la ruta al archivo de entrada (desde) en el directorio y el nombre del archivo (captura \1 y \2) y luego inserta el elemento adicional \x entre ellos (a).

No tengo claro tu ejemplo: parece que quieres unir 'bar.pdf' y cambiarle el nombre a 'foo.pdf', así como también cambiar el directorio. Si necesita hacer eso, usted podría considerar encadenar un par de creadores de mapas de expresiones regulares más simples, en lugar de tratar de cocinar una compleja:

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

Al utilizar un asignador glob, es necesario especificar un comodín * en el desde el campo:

hacia y desde se requieren y definir patrones que pueden contener a lo sumo un *. Para cada archivo fuente que coincida con el del patrón, un nombre de archivo se construirá desde el al patrón sustituyendo el * en por el patrón con el texto que coincide con el * en el patrón from. Se ignorarán los nombres de archivos de origen que no coincidan con el del patrón.

Así que algo como esto podría funcionar:

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

Lo siento, estaba ofuscar mis nombres de archivo hasta el punto de confusión. Ambos deberían haber sido renombrados foo.pdf. En cualquier caso, el primer bloque de código lo hizo por mí. ¡Gracias! ¿Alguna idea sobre por qué mi mapper glob estaba equivocado? – GJTorikian

+0

@GJTorikian - He añadido una nota sobre el mapador glob, hth. –

Cuestiones relacionadas