2010-11-18 13 views
7

ディレクトリ内のファイルを同じフォルダ構造のコピー先ディレクトリにコピーし、もう1つのサブフォルダを追加するAntターゲットを作成します。マッパーとファイルセットを使ってファイルを別のサブディレクトリにコピーしますか?

たとえば、ソースは次のとおりです。

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

私は先になりたい:ここ

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

は、私の目標は、これまでのところですが、それは何をやっているとは思われません。

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

私は何が欠けていますか?

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

私が短縮するようにハードコーディングされたfile.separatorsを使用しました:

答えて

11

あなたがregexpマッパーを使用することができます。基本的には、パスを入力ファイル(from)からディレクトリとファイル名(キャプチャ\1\2)に分割してから、\xという余分な要素を(〜に)挿入します。

あなたの例では明確ではありません。「bar.pdf」と一致させ、その名前を「foo.pdf」に変更し、ディレクトリを変更するように見えます。あなたがそれを行う必要がある場合は、むしろ1複雑なものを調理しようとするよりも、単純な正規表現マッパーのカップルを連鎖検討するかもしれない:

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

globマッパーを使用している場合、あなたは1つのワイルドカード*を指定する必要がありますフィールドから:へとから

の両方が必要とされていると は* 最も1に含まれていてもよいパターンを定義します。 がfromパターンと一致する各ソースファイルの場合、 のファイル名は から作成され、 の*にtoパターンを、 がfromパターンの*と一致するテキストに置き換えてパターン化されます。 パターンからの と一致しないソースファイル名は無視されます。

したがって、このような何かがうまくいくかもしれない:

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

申し訳ありませんが、私は混乱のポイントに私のファイル名を難読化されました。両方ともfoo.pdfに名前を変更する必要があります。いずれにしても、最初のコードブロックが私にとってそれを行いました。ありがとうございました!私のglobマッパーが間違っていた理由についてのアイデア? – GJTorikian

+0

@GJTorikian - グロッサーマッパーのメモを追加しました。 –

関連する問題