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?


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)


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


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.


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


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.


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>

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.


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.


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>

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>

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.


il dit littéralement qu'il copierait l'inverse: P
nonchip
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.