Comment copier un répertoire en utilisant Ant

99

J'ai utilisé copydirpour copier une arborescence de répertoires mais elle est obsolète. Mon répertoire contient des sous-répertoires, certains contiennent des fichiers et d'autres contiennent plus de sous-répertoires.

Comment puis-je copier l'arborescence entière?

Sunil Kumar Sahoo
la source
5
On dirait que vous voulez faire une copie récursive. Et c'est la solution offerte par Omnipresent. Plus de gens trouveront cette question si le mot «récursif» figurait dans la question.
Jason

Réponses:

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

croyez que cela fera ce que vous voulez ... (copie récursive faite)

Omniprésent
la source
3
apparemment, le includesn'est pas nécessaire quand on veut tout (voir réponse de l'utilisateur s1n )
Abel
40
Cela copie le contenu de {src.dir}, mais pas le répertoire réel
cmcginty
Copies non pas un fait mais c'est contenu.
A-Live
Puisque vous êtes la réponse acceptée, vous pourriez la corriger pour qu'elle devienne la bonne réponse (la réponse d'ery est correcte) ;-)
Christian Fries
Je crois comprendre que l'idée de SO est une curation collective, c'est pourquoi n'importe qui peut éditer la question de quelqu'un d'autre (bien que vous ayez besoin de beaucoup de représentants pour sauter la révision d'édition).
Andrew Spencer
117

Copiez le contenu, y compris le répertoire lui-même.

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

Remarque: $ {src.dir} est relatif à $ {src.dir.parent}, et non à un chemin complet

ery
la source
12
cela devrait être la bonne réponse. L'autre réponse concerne la question "Comment copier le contenu d'un répertoire en utilisant Ant". Il y a une différence subtile.
cmcginty
"cela devrait être la bonne réponse": Absolument, même si la différence n'est pas si subtile lorsque vous ne pouvez pas charger vos ressources avec les chemins d'accès attendus.
Jim Pivarski
1
cela ne fonctionne pas pour la fourmi 1.8, il semble que rien ne s'est passé.
CCC
8
@CCC s'assure que $ {src.dir} est relatif à $ {src.dir.parent}, et non à un chemin complet
Mike Demenok
très trompeur comment x.parentest censé ne pas être le parentde x... -_-
nonchip
25

Vous ne devriez avoir qu'à spécifier le répertoire (sans la propriété includes):

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

Consultez le manuel pour plus de détails et d'exemples.

s1n
la source
13
@ s1n Cette commande copie uniquement tout le contenu de src_dir dans ../new/dir et non dans src_dir. Comment copier src_dir (répertoire) vers un autre emplacement?
Pipalayan Nayak
14

Copiez le contenu, y compris le répertoire lui-même.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
la source
2
C'est l'option la plus succincte. Voir également ant.apache.org/manual/Types/fileset.html .
Jess
2

Un point fin: ant ne copiera les sous-répertoires que si les fichiers source sont plus récents que les fichiers de destination. [1] Dans mon cas, les sous-répertoires n'étaient pas copiés (j'utilise verbose = "true"), car il n'y avait pas de changements et ils étaient déjà dans la destination. Vous pouvez utiliser "écraser" pour le forcer, ou toucher certains des fichiers dans vos sous-répertoires source.

Jess
la source
2

J'ai utilisé des balises d'inclusion comme indiqué dans l'extrait de code ci-dessous dans mon fichier build.xml pour copier des fichiers jar individuels dans un répertoire.

<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
la source
1

À partir de l'exemple ici , vous pouvez écrire un simple fichier Ant à l'aide de la tâche de copie.

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

Cela devrait copier tout ce qui se trouve à l'intérieur src_dir(à l'exclusion de celui-ci) dans new/dir.

NawaMan
la source
6
il s'agit simplement de copier le contenu du répertoire. pas le contenu, y compris le directement. :(
ghostCoder
1

J'ajoute un modèle plus générique pour copier tous les sous-dossiers.

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

Voir Modèles pour plus de détails.

sartoris
la source
1

Copydir est une autre tâche de fourmi . L'élément clé ici est d'inclure le nom du répertoire que vous souhaitez copier après le répertoire dest. Les sous-répertoires et fichiers seront copiés automatiquement.

<target name="-post-jar">
    <copydir src="config" dest="${dist.dir}/config/"/>
</target>
Andrei
la source
Depuis votre lien: cette tâche est obsolète. Utilisez plutôt la tâche Copier.
Jim
0

Ce code doit copier le dossier ainsi que son contenu. Il utilise également la tâche basename pour éviter d'avoir à effectuer une analyse manuelle des chemins.

<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
la source
0

J'ai finalement copié en utilisant le code suivant

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

Cela copiera le dossier src de dist vers build.

J'espère que cela aide quelqu'un.

Dilip Rajkumar
la source
il dit littéralement qu'il copierait l'inverse: P
nonchip