Cómo copiar un directorio usando Ant

99

Solía copydircopiar un árbol de directorios pero está en desuso. Mi directorio contiene algunos subdirectorios, y algunos de ellos contienen archivos y otros contienen más subdirectorios.

¿Cómo puedo copiar todo el árbol?

Sunil Kumar Sahoo
fuente
5
Parece que quieres hacer una copia recursiva. Y esa es la solución que dio Omnipresent. Más personas pueden encontrar esta pregunta si la palabra "recursiva" apareció en la pregunta.
Jason

Respuestas:

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

cree que hará lo que quiera ... (copia recursiva hecha)

Omnipresente
fuente
3
aparentemente, includesno es necesario cuando quieres todo (ver la respuesta del usuario s1n )
Abel
40
Esto copia el contenido de {src.dir}, pero no el directorio real
cmcginty
Las copias no lo hicieron, pero su contenido.
A-Live
Como eres la respuesta aceptada, puedes corregirla para que se convierta en la respuesta correcta (la respuesta de ery es correcta) ;-)
Christian Fries
Tengo entendido que la idea de SO es la curación colectiva, por lo que cualquiera puede editar la pregunta de otra persona (aunque se necesita mucho representante para omitir la revisión de la edición).
Andrew Spencer
117

Copie el contenido, incluido el directorio en sí.

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

Nota: $ {src.dir} es relativo a $ {src.dir.parent} y no es una ruta completa

ery
fuente
12
esta debería ser la respuesta CORRECTA. La otra respuesta es para la pregunta "¿Cómo se copia el contenido de un directorio usando Ant". Hay una sutil diferencia.
cmcginty
"Esta debería ser la respuesta CORRECTA": Absolutamente, aunque la diferencia no es tan sutil cuando no puede cargar sus recursos con los nombres de ruta esperados.
Jim Pivarski
1
no funciona para ant 1.8, parece que no pasó nada.
CCC
8
@CCC asegúrese de que $ {src.dir} sea relativo a $ {src.dir.parent}, y no una ruta completa
Mike Demenok
muy engañoso cómo x.parentse supone que NO SERÁ el parentde x... -_-
chip
25

Solo debería tener que especificar el directorio (sin la propiedad incluye):

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

Consulte el manual para obtener más detalles y ejemplos.

s1n
fuente
13
@ s1n Este comando solo copia todo el contenido de src_dir a ../new/dir y no src_dir. ¿Cómo copiamos src_dir (directorio) a otra ubicación?
Pipalayan Nayak
14

Copie el contenido, incluido el directorio en sí.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
fuente
2
Ésta es la opción más sucinta. Consulte también ant.apache.org/manual/Types/fileset.html .
Jess
2

Un buen punto: ant solo copiará los subdirectorios si los archivos de origen son más nuevos que los de destino. [1] En mi caso, los subdirectorios no se estaban copiando (estoy usando verbose = "true"), ya que no hubo cambios y ya estaban en el destino. Puede usar "sobrescribir" para forzarlo, o tocar algunos de los archivos en sus subdirectorios de origen.

Encadenar
fuente
2

Usé incluir etiquetas como se muestra en el siguiente fragmento de código en mi archivo build.xml para copiar archivos jar individuales dentro de un directorio.

<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
fuente
1

A partir del ejemplo aquí , puede escribir un archivo Ant simple usando la tarea de copia.

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

Esto debería copiar todo el interior src_dir(excluyéndolo) a new/dir.

NawaMan
fuente
6
esto es simplemente copiar el contenido del directorio. no el contenido incluido el directamente. :(
ghostCoder
1

Estoy agregando un patrón más genérico para copiar todas las subcarpetas.

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

Consulte Patrones para obtener más detalles.

sartoris
fuente
1

Otra tarea de hormigas es Copydir . La parte clave aquí es incluir el nombre del directorio que desea copiar después del directorio dest. Los subdirectorios y archivos se copiarán automáticamente.

<target name="-post-jar">
    <copydir src="config" dest="${dist.dir}/config/"/>
</target>
Andrei
fuente
Desde su enlace: esta tarea ha quedado obsoleta. En su lugar, utilice la tarea Copiar.
Jim
0

Este código debería copiar la carpeta y su contenido. También utiliza la tarea de nombre base para evitar tener que realizar un análisis manual de la ruta.

<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
fuente
0

Finalmente copié usando el siguiente código

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

Esto copiará la carpeta src de dist a build.

Espero que esto ayude a alguien.

Dilip Rajkumar
fuente
Sin embargo, literalmente dice que copiaría al revés: P
chip