2010-11-18 38 views
7

Tôi muốn tạo mục tiêu Ant sao chép tệp trong thư mục vào thư mục đích có cùng cấu trúc thư mục, cộng với một thư mục con khác được thêm vào.Sử dụng trình ánh xạ & bộ tập tin để sao chép các tệp vào một thư mục con khác?

Ví dụ, nguồn là:

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

tôi muốn điểm đến là:

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

Đây là mục tiêu của tôi cho đến nay, nhưng nó không xuất hiện để được làm bất cứ điều gì:

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

Tôi đang thiếu gì?

Trả lời

11

Bạn có thể sử dụng một mapper 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> 

Tôi đã sử dụng file.separators mã hóa cứng để rút ngắn. Về cơ bản, bạn chia đường dẫn đến tệp đầu vào (từ) thành thư mục và tên tệp (chụp \1\2) và sau đó chèn phần tử phụ \x vào giữa chúng (tới).

Tôi không rõ ràng về ví dụ của bạn - có vẻ như bạn muốn khớp 'bar.pdf' và đổi tên thành 'foo.pdf', cũng như thay đổi thư mục. Nếu bạn cần phải làm điều đó, bạn có thể xem xét chaining một vài người vẽ bản đồ regexp đơn giản hơn, chứ không phải cố gắng để nấu lên một phức tạp một:

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

Khi sử dụng một mapper glob, bạn cần phải xác định một ký tự đại diện * trong từ trường:

Cả hai đến và từ được yêu cầu và xác định các mẫu có thể chứa tại nhất một *. Đối với mỗi tệp nguồn mà khớp với mẫu từ, tên mục tiêu sẽ được tạo từ thành mẫu bằng cách thay thế * trong mẫu với văn bản khớp với * trong mẫu từ. Tên tệp nguồn không khớp với từ mẫu sẽ bị bỏ qua.

Vì vậy, một cái gì đó như thế này có thể làm việc:

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

Xin lỗi, tôi đã Obfuscating tên tập tin của tôi đến mức gây nhầm lẫn. Cả hai đều nên được đổi tên thành foo.pdf. Trong mọi trường hợp, khối mã đầu tiên đã làm điều đó cho tôi. Cảm ơn bạn! Bất kỳ ý tưởng về lý do tại sao bản đồ glob của tôi đã sai? – GJTorikian

+0

@GJTorikian - Tôi đã thêm một ghi chú trên công cụ lập bản đồ glob, hth. –

Các vấn đề liên quan