Cách sao chép thư mục bằng Ant


99

Tôi đã từng copydirsao chép cây thư mục nhưng nó không được dùng nữa. Thư mục của tôi chứa một số thư mục con và một số trong số đó chứa tệp và những thư mục khác chứa nhiều thư mục con hơn.

Làm thế nào tôi có thể sao chép toàn bộ cây?


5
Có vẻ như bạn muốn tạo một bản sao đệ quy. Và đó là giải pháp mà Omnipresent đã đưa ra. Nhiều người có thể tìm thấy câu hỏi này nếu từ "đệ quy" xuất hiện trong câu hỏi.
Jason

Câu trả lời:


113
<copy todir="${dest.dir}" >  
    <fileset dir="${src.dir}" includes="**"/>  
</copy> 

tin rằng điều đó sẽ làm được những gì bạn muốn ... (Đã thực hiện xong bản sao đệ quy)


3
rõ ràng, sự includeslà không cần thiết khi bạn muốn tất cả mọi thứ (xem câu trả lời của thành viên s1n )
Abel

40
Bản này các nội dung của {} src.dir, nhưng không phải là thư mục thực tế
cmcginty

Bản sao không phải là đã làm nhưng đó là nội dung.
A-Live

Vì bạn là câu trả lời được chấp nhận, bạn có thể sửa nó để trở thành câu trả lời chính xác (câu trả lời của ery là đúng) ;-)
Christian Fries

Tôi tập hợp rằng ý tưởng về SO là giám tuyển tập thể, đó là lý do tại sao bất kỳ ai cũng có thể chỉnh sửa câu hỏi của người khác (mặc dù bạn cần rất nhiều đại diện để bỏ qua đánh giá chỉnh sửa).
Andrew Spencer

117

Sao chép nội dung bao gồm cả chính thư mục.

<copy todir="${dest.dir}" >  
    <fileset dir="${src.dir.parent}">  
        <include name="${src.dir}/**"/>
    </fileset>
</copy>

Lưu ý: $ {src.dir} có liên quan đến $ {src.dir.parent} và không phải là một đường dẫn đầy đủ


12
đây sẽ là câu trả lời ĐÚNG. Câu trả lời khác dành cho câu hỏi "Làm thế nào để bạn sao chép nội dung của một thư mục bằng Ant". Có một sự khác biệt tinh tế.
cmcginty

"đây phải là câu trả lời ĐÚNG": Hoàn toàn có thể, mặc dù sự khác biệt không quá nhỏ khi bạn không thể tải tài nguyên của mình với tên đường dẫn như mong đợi.
Jim Pivarski

1
nó không hoạt động đối với kiến ​​1.8, có vẻ như không có gì xảy ra.
CCC

8
@CCC đảm bảo $ {src.dir} có liên quan đến $ {src.dir.parent} và không phải là một đường dẫn đầy đủ
Mike Demenok

rất sai lầm làm thế nào x.parentđược cho là KHÔNG PHẢI là parentcủa x... -_-
nonchip

25

Bạn chỉ nên chỉ định thư mục (không có thuộc tính include):

<copy todir="../new/dir">
    <fileset dir="src_dir"/>
</copy>

Xem hướng dẫn để biết thêm chi tiết và ví dụ.


13
@ s1n Lệnh này chỉ sao chép tất cả nội dung của src_dir sang ../new/dir chứ không phải src_dir. Làm cách nào để sao chép src_dir (thư mục) sang một vị trí khác?
Pipalayan Nayak


2

Một điểm tốt: ant sẽ chỉ sao chép các thư mục con nếu tệp nguồn mới hơn tệp đích. [1] Trong trường hợp của tôi, các dirs phụ không được sao chép (tôi đang sử dụng verbose = "true"), vì không có thay đổi nào và chúng đã ở đích. Bạn có thể sử dụng "ghi đè" để buộc nó hoặc chạm vào một số tệp trong dirs nguồn của bạn.


2

Tôi đã sử dụng các thẻ bao gồm như được hiển thị trong đoạn mã bên dưới trong tệp build.xml của mình để sao chép các tệp jar riêng lẻ bên trong một thư mục.

<target name="devInstall" depends="generateXsl" description="testing">
<copy flatten="true" todir="${test}/WEB-INF/lib" overwrite="${overwrite}">
                <fileset refid="buildJars"/>
                <fileset dir="lib">
                    <include name="commons-collections-*.jar"/>
                    <include name="commons-io-*.jar"/>              
                    <include name="kodo/*.jar"/>
                    <include name="mail*.jar"/>    
                    <include name="activation*.jar"/>               
                    <include name="guava*.jar"/>
                    <include name="jna*.jar"/>                          
                </fileset>          
            </copy>
</target>

1

Từ ví dụ ở đây , bạn có thể viết một tệp Ant đơn giản bằng tác vụ sao chép.

<project name="MyProject" default="copy" basedir=".">
    <target name="copy">
        <copy todir="./new/dir">
           <fileset dir="src_dir"/>
        </copy>
    </target>
</project>

Điều này sẽ sao chép mọi thứ bên trong src_dir(ngoại trừ nó) sang new/dir.


6
đây chỉ là sao chép nội dung của thư mục. không phải nội dung bao gồm trực tiếp. :(
ghostCoder,

1

Tôi đang thêm một mẫu chung chung hơn để sao chép tất cả các thư mục con.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir}" includes="**/*"/>
</copy>

Xem Mẫu để biết chi tiết.


1

Một nhiệm vụ kiến ​​khác là Copydir . Phần quan trọng ở đây là bao gồm tên của thư mục bạn muốn sao chép sau thư mục đích. Các thư mục con và tệp sẽ được sao chép tự động.

<target name="-post-jar">
    <copydir src="config" dest="${dist.dir}/config/"/>
</target>

Từ liên kết của bạn: Tác vụ này không được dùng nữa. Sử dụng tác vụ Sao chép thay thế.
Jim

0

Mã này sẽ sao chép thư mục cũng như nội dung của nó. Nó cũng sử dụng tác vụ tên cơ sở để tránh phải thực hiện bất kỳ phân tích đường dẫn thủ công nào.

<project name="Build" default="doCopy">
  <property name="source.dir" value="SourceDirPathGoesHere"/>
  <property name="dest.dir" value="DestinationDirPathGoesHere"/>
  <target name="doCopy">
    <basename property="source.dir.base.name" file="${source.dir}"/>
    <copy todir="${dest.dir}">
      <fileset dir="${source.dir}/.." includes="${source.dir.base.name}/**"/>
    </copy>
  </target>
</project>

0

Cuối cùng tôi đã sao chép bằng cách sử dụng mã sau

<copy todir="${root.dir}/dist/src">  
                <fileset dir="${root.dir}/build/src" includes="**"/>  
            </copy>

Thao tác này sẽ sao chép thư mục src từ dist để xây dựng.

Hy vọng điều này sẽ giúp ai đó.


nó theo nghĩa đen nói rằng nó sẽ sao chép theo cách khác: P
nonchip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.