Jak skopiować katalog za pomocą Ant


99

Kiedyś copydirkopiowałem drzewo katalogów, ale jest przestarzałe. Mój katalog zawiera kilka podkatalogów, a niektóre z nich zawierają pliki, a inne zawierają więcej podkatalogów.

Jak mogę skopiować całe drzewo?


5
Wygląda na to, że chcesz wykonać kopię rekurencyjną. I to jest rozwiązanie, które dał Wszechobecny. Więcej osób może znaleźć to pytanie, jeśli pojawiło się w nim słowo „rekurencyjny”.
Jason

Odpowiedzi:


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

uwierz, że zrobi to, co chcesz ... (kopia rekurencyjna wykonana)


3
najwyraźniej includesnie jest to konieczne, gdy chcesz wszystkiego (zobacz odpowiedź użytkownika s1n )
Abel

40
To kopiuje zawartość {src.dir}, ale nie rzeczywisty katalog
cmcginty,

Nie ma kopii, ale to treść.
A-Live

Ponieważ jesteś zaakceptowaną odpowiedzią, możesz ją poprawić, aby stała się poprawną odpowiedzią (odpowiedź ery jest poprawna) ;-)
Christian Fries

Rozumiem, że ideą SO jest kolektywna kuracja, dlatego każdy może edytować czyjeś pytanie (chociaż potrzebujesz dużo przedstawiciela, aby pominąć recenzję edycji).
Andrew Spencer,

117

Skopiuj zawartość, w tym sam katalog.

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

Uwaga: $ {src.dir} jest odniesieniem do $ {src.dir.parent}, a nie pełną ścieżką


12
to powinna być PRAWIDŁOWA odpowiedź. Inna odpowiedź dotyczy pytania „Jak skopiować zawartość katalogu za pomocą programu Ant”. Jest subtelna różnica.
cmcginty

„to powinna być PRAWIDŁOWA odpowiedź”: Oczywiście, chociaż różnica nie jest tak subtelna, gdy nie możesz załadować zasobów za pomocą oczekiwanych nazw ścieżek.
Jim Pivarski,

1
nie działa dla mrówki 1.8, wydaje się, że nic się nie stało.
CCC

8
@CCC upewnij się, że $ {src.dir} jest względne w stosunku do $ {src.dir.parent}, a nie pełna ścieżka
Mike Demenok

bardzo mylące jak x.parentma nie być parentz x... -_-
nonchip

25

Powinieneś tylko określić katalog (bez właściwości include):

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

Więcej szczegółów i przykładów znajdziesz w instrukcji .


13
@ s1n To polecenie kopiuje całą zawartość src_dir do ../new/dir, a nie src_dir. Jak skopiujemy src_dir (katalog) do innej lokalizacji?
Pipalayan Nayak


2

Dobra uwaga: ant skopiuje podkatalogi tylko wtedy, gdy pliki źródłowe są nowsze niż pliki docelowe. [1] W moim przypadku podkatalogi nie były kopiowane (używam verbose = "true"), ponieważ nie było żadnych zmian i były już w miejscu docelowym. Możesz użyć „overwrite”, aby wymusić to, lub dotknąć niektórych plików w źródłowych katalogach podrzędnych.


2

Użyłem tagów dołączania, jak pokazano na poniższym fragmencie kodu w moim pliku build.xml, aby skopiować pojedyncze pliki jar do katalogu.

<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

Z przykładu tutaj można napisać prosty plik, używając Ant zadanie kopiowania.

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

Powinno to skopiować wszystko, co jest w środku src_dir(z wyłączeniem tego) do new/dir.


6
to po prostu kopiowanie zawartości katalogu. nie zawartość, w tym bezpośrednio. :(
ghostCoder

1

Dodaję bardziej ogólny wzorzec, aby skopiować wszystkie podfoldery.

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

Aby uzyskać szczegółowe informacje, zobacz Wzory .


1

Kolejnym zadaniem mrówek jest Copydir . Kluczową częścią jest dołączenie nazwy katalogu, który chcesz skopiować po katalogu docelowym. Podkatalogi i pliki zostaną skopiowane automatycznie.

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

Z Twojego linku: to zadanie zostało wycofane. Zamiast tego użyj zadania Kopiuj.
Jim

0

Ten kod powinien skopiować folder, a także jego zawartość. Używa również zadania basename, aby uniknąć konieczności ręcznego analizowania ścieżki.

<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

W końcu skopiowałem używając następującego kodu

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

Spowoduje to skopiowanie folderu src z dist do build.

Mam nadzieję, że to komuś pomoże.


dosłownie mówi, że skopiowałoby odwrotnie: P
nonchip
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.