2010-11-18 5 views
7

Ich möchte ein Ant-Ziel erstellen, das Dateien in einem Verzeichnis in ein Zielverzeichnis mit der gleichen Ordnerstruktur sowie einen weiteren angehängten Unterordner kopiert.Verwenden von Mapper & Fileset zum Kopieren von Dateien in ein anderes Unterverzeichnis?

Zum Beispiel ist die Quelle:

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

ich das Ziel sein will:

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

Hier ist mein Ziel ist es so weit, aber es scheint nicht, etwas zu tun:

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

Was fehlt mir?

Antwort

11

Sie könnten einen regexp Mapper verwenden:

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

Ich habe zu verkürzen hartcodierte file.separators verwendet. Grundsätzlich teilen Sie den Pfad zur Eingabedatei (von) in Verzeichnis und Dateiname (capture \1 und \2) und fügen Sie dann das zusätzliche Element \x dazwischen (to).

Ich bin nicht klar in Ihrem Beispiel - es sieht so aus, als ob Sie "bar.pdf" anpassen und es in "foo.pdf" umbenennen sowie das Verzeichnis ändern möchten. Wenn Sie das tun müssen, könnten Sie ein paar einfacher regexp Mapper Chaining, anstatt zu versuchen, eine komplex zu kochen:

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

Wenn ein glob Mapper verwenden, müssen Sie eine Wildcard * in die angeben von Feld:

sowohl zu als auch aus erforderlich sind und definieren Muster, die auf höchstens eine * enthalten. Für jede Quelldatei, die die von Mustern übereinstimmt, werden ein Ziel Dateinamen durch Ersetzen der * in die auf Muster mit dem Text, dass entspricht die * in dem vom Muster aus den zu Mustern aufgebaut sein. Quelldateinamen, die nicht mit dem Muster übereinstimmen, werden ignoriert.

So etwas wie dies funktionieren könnte:

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

Sorry, ich meine Dateinamen auf den Punkt der Verwirrung wurde Verschleiern. Beide sollten in foo.pdf umbenannt worden sein. Jedenfalls hat der erste Codeblock das für mich getan. Vielen Dank! Irgendwelche Ideen, warum mein Glob Mapper falsch war? – GJTorikian

+0

@GJTorikian - Ich habe eine Notiz zum Glob Mapper hinzugefügt, hth. –

Verwandte Themen