Come copiare una directory usando Ant


99

Ho usato copydirper copiare un albero di directory ma è deprecato. La mia directory contiene alcune sottodirectory e alcune di esse contengono file e altre contengono più sottodirectory.

Come posso copiare l'intero albero?


5
Sembra che tu voglia fare una copia ricorsiva. E questa è la soluzione offerta da Onnipresent. Più persone potrebbero trovare questa domanda se la parola "ricorsivo" apparisse nella domanda.
Jason

Risposte:


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

credi che farà quello che vuoi ... (Copia ricorsiva fatta)


3
a quanto pare, includesnon è necessario quando vuoi tutto (vedi risposta dell'utente s1n )
Abel

40
Copia il contenuto di {src.dir}, ma non la directory effettiva
cmcginty

Le copie non sono state fatte ma è contenuto.
A-Live

Dato che sei la risposta accettata, potresti correggerla per diventare la risposta corretta (la risposta di ery è corretta) ;-)
Christian Fries

Capisco che l'idea di SO sia una cura collettiva, motivo per cui chiunque può modificare la domanda di qualcun altro (anche se hai bisogno di molti rappresentanti per saltare la revisione della modifica).
Andrew Spencer

117

Copia i contenuti inclusa la directory stessa.

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

Nota: $ {src.dir} è relativo a $ {src.dir.parent} e non è un percorso completo


12
questa dovrebbe essere la risposta CORRETTA. L'altra risposta è per la domanda "Come si copia il contenuto di una directory utilizzando Ant". C'è una sottile differenza.
cmcginty

"questa dovrebbe essere la risposta CORRETTA": Assolutamente, anche se la differenza non è così sottile quando non puoi caricare le tue risorse con i nomi di percorso previsti.
Jim Pivarski

1
non funziona per Ant 1.8, sembra che non sia successo niente.
CCC

8
@CCC garantisce che $ {src.dir} sia relativo a $ {src.dir.parent} e non un percorso completo
Mike Demenok

molto fuorviante come x.parentdovrebbe NON ESSERE il parentdi x... -_-
nonchip

25

Dovresti solo specificare la directory (senza la proprietà include):

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

Vedere il manuale per ulteriori dettagli ed esempi.


13
@ s1n Questo comando copia solo tutto il contenuto di src_dir in ../new/dir e non in src_dir. Come copiamo src_dir (directory) in un'altra posizione?
Pipalayan Nayak


2

Un bel punto: ant copierà le sottodirectory solo se i file di origine sono più recenti dei file di destinazione. [1] Nel mio caso, le sottodirectory non venivano copiate (sto usando verbose = "true"), poiché non c'erano modifiche ed erano già nella destinazione. Puoi usare "sovrascrittura" per forzarlo, o toccare alcuni dei file nelle tue sottodirectory di origine.


2

Ho usato i tag include come mostrato nello snippet di codice di seguito nel mio file build.xml per copiare i singoli file jar all'interno di una directory.

<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

Dall'esempio qui , puoi scrivere un semplice file Ant utilizzando l'attività di copia.

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

Questo dovrebbe copiare tutto all'interno src_dir(escluso) in new/dir.


6
si tratta solo di copiare il contenuto della directory. non il contenuto compreso direttamente. :(
ghostCoder

1

Sto aggiungendo un modello più generico per copiare tutte le sottocartelle.

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

Vedi modelli per i dettagli.


1

Un altro compito delle formiche è Copydir . La parte fondamentale qui è includere il nome della directory che si desidera copiare dopo la directory di destinazione. Le sottodirectory e i file verranno copiati automaticamente.

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

Dal tuo link: questa attività è stata deprecata. Utilizza invece l'attività Copia.
Jim

0

Questo codice dovrebbe copiare la cartella e il suo contenuto. Utilizza anche l'attività basename per evitare di dover eseguire alcuna analisi manuale del percorso.

<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

Alla fine ho copiato usando il seguente codice

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

Questo copierà la cartella src da dist a build.

Spero che questo aiuti qualcuno.


letteralmente dice che
copierebbe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.