So kopieren Sie ein Verzeichnis mit Ant


99

Ich habe copydireinen Verzeichnisbaum kopiert, aber er ist veraltet. Mein Verzeichnis enthält einige Unterverzeichnisse, und einige enthalten Dateien, andere enthalten weitere Unterverzeichnisse.

Wie kann ich den gesamten Baum kopieren?


5
Klingt so, als ob Sie eine rekursive Kopie erstellen möchten. Und das ist die Lösung, die Omnipresent gegeben hat. Weitere Personen finden diese Frage möglicherweise, wenn das Wort "rekursiv" in der Frage vorkommt.
Jason

Antworten:


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

glaube, das wird tun, was du willst ... (Rekursive Kopie fertig)


3
anscheinend ist das includesnicht nötig, wenn du alles willst (siehe Antwort von Benutzer s1n )
Abel

40
Dies kopiert den Inhalt von {src.dir}, aber nicht das eigentliche Verzeichnis
cmcginty

Kopiert kein Did, aber es ist Inhalt.
A-Live

Da Sie die akzeptierte Antwort sind, können Sie sie korrigieren, um die richtige Antwort zu werden (erys Antwort ist korrekt) ;-)
Christian Fries

Ich verstehe, dass die Idee von SO eine kollektive Kuration ist, weshalb jeder die Frage eines anderen bearbeiten kann (obwohl Sie viel Wiederholung benötigen, um die Bearbeitung zu überspringen).
Andrew Spencer

117

Kopieren Sie den Inhalt einschließlich des Verzeichnisses.

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

Hinweis: $ {src.dir} ist relativ zu $ ​​{src.dir.parent} und kein vollständiger Pfad


12
Dies sollte die richtige Antwort sein. Die andere Antwort bezieht sich auf die Frage "Wie kopieren Sie den Inhalt eines Verzeichnisses mit Ant?". Es gibt einen subtilen Unterschied.
cmcginty

"Dies sollte die RICHTIGE Antwort sein": Absolut, obwohl der Unterschied nicht so subtil ist, wenn Sie Ihre Ressourcen nicht mit den erwarteten Pfadnamen laden können.
Jim Pivarski

1
es funktioniert nicht für Ameise 1.8, es scheint, dass nichts passiert ist.
CCC

8
@CCC sicherstellen, dass $ {src.dir} relativ zu $ {src.dir.parent} ist und kein vollständiger Pfad
Mike Demenok

sehr irreführend, wie x.parentsoll NICHT der parentvon x... -_-
nonchip

25

Sie sollten nur das Verzeichnis angeben müssen (ohne die Includes-Eigenschaft):

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

Weitere Details und Beispiele finden Sie im Handbuch .


13
@ s1n Dieser Befehl kopiert nur den gesamten Inhalt von src_dir nach ../new/dir und nicht nach src_dir. Wie kopieren wir src_dir (Verzeichnis) an einen anderen Ort?
Pipalayan Nayak


2

Ein guter Punkt: ant kopiert die Unterverzeichnisse nur, wenn die Quelldateien neuer als die Zieldateien sind. [1] In meinem Fall wurden die Unterverzeichnisse nicht kopiert (ich verwende verbose = "true"), da es keine Änderungen gab und sie sich bereits im Ziel befanden. Sie können "Überschreiben" verwenden, um es zu erzwingen, oder einige der Dateien in Ihren Quell-Unterverzeichnissen berühren.


2

Ich habe Include-Tags verwendet, wie im folgenden Code-Snippet in meiner build.xml-Datei gezeigt, um einzelne JAR-Dateien in ein Verzeichnis zu kopieren.

<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

Aus dem Beispiel hier können Sie eine einfache Ant-Datei mithilfe der Kopieraufgabe schreiben.

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

Dies sollte alles darin kopieren src_dir(außer es) new/dir.


6
Dies kopiert nur den Inhalt des Verzeichnisses. nicht die Inhalte einschließlich der direkt. :(
GhostCoder

1

Ich füge ein allgemeineres Muster hinzu, um alle Unterordner zu kopieren.

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

Weitere Informationen finden Sie unter Muster .


1

Eine weitere Ameisenaufgabe ist Copydir . Der wichtigste Teil hier ist, den Namen des Verzeichnisses anzugeben, das Sie nach dem Zielverzeichnis kopieren möchten. Die Unterverzeichnisse und Dateien werden automatisch kopiert.

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

Von Ihrem Link: Diese Aufgabe ist veraltet. Verwenden Sie stattdessen die Aufgabe Kopieren.
Jim

0

Dieser Code sollte den Ordner sowie dessen Inhalt kopieren. Außerdem wird die Basisnamen-Task verwendet, um zu vermeiden, dass eine manuelle Pfadanalyse durchgeführt werden muss.

<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

Ich habe schließlich mit folgendem Code kopiert

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

Dadurch wird der src-Ordner von dist zum Erstellen kopiert.

Hoffe das hilft jemandem.


es sagt wörtlich, dass es umgekehrt kopieren würde: P
nonchip
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.