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?

Sunil Kumar Sahoo
quelle
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)

Allgegenwärtig
quelle
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

ery
quelle
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 .

s1n
quelle
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
14

Kopieren Sie den Inhalt einschließlich des Verzeichnisses.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
quelle
2
Dies ist die prägnanteste Option. Siehe auch ant.apache.org/manual/Types/fileset.html .
Jess
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.

Jess
quelle
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>
Raman B.
quelle
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.

NawaMan
quelle
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 .

Sartoris
quelle
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>
Andrei
quelle
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>
user506069
quelle
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.

Dilip Rajkumar
quelle
es sagt wörtlich, dass es umgekehrt kopieren würde: P
nonchip