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?

Sunil Kumar Sahoo
źródło
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)

Wszechobecny
źródło
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ą

ery
źródło
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 .

s1n
źródło
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
14

Skopiuj zawartość, w tym sam katalog.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
źródło
2
To najbardziej zwięzła opcja. Zobacz także ant.apache.org/manual/Types/fileset.html .
Jess,
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.

Pęto
źródło
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>
Ramana B.
źródło
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.

NawaMan
źródło
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 .

sartoris
źródło
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>
Andrei
źródło
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>
user506069
źródło
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.

Dilip Rajkumar
źródło
dosłownie mówi, że skopiowałoby odwrotnie: P
nonchip