2010-08-17 13 views
16

¿Existe algún comando para copiar archivos de una estructura de carpetas a otra sin comprobar la última fecha/hora de modificación sobrescribir archivos. Básicamente, quiero todos los archivos extra de la carpeta A a la carpeta B. Es decir: no se reemplazan los archivos de la carpeta B, pero los archivos adicionales de la carpeta A aparecen en la carpeta B.Ant archivos de copia

Vi comandos "ant copy" y "ant move", pero no ayudaron. Alguna sugerencia.

+3

¿Has probado usar ant copy con overwrite = "true"? –

+0

¿Puedo preguntar por qué agregó la etiqueta maven-2? ¿Estás hablando de hormiga incrustada en maven? –

+0

La mayoría de las personas que usan maven vienen del fondo de la hormiga, además de que tienes razón, siempre puedo incrustar la hormiga en maven. – user204069

Respuesta

3

Si no hay una solución elegante que siempre puede hacerlo en una secuencia:

  1. <move> carpeta <B> a <C>
  2. <copy> archivos de la carpeta <A> a <B>
  3. <copy> archivos de la carpeta <C> a <B> usando overwrite=true

(Haga las cosas al revés, en sustitución de los archivos nuevos, no los viejos)

+0

Esto no ayudó porque la fecha de la última modificación aún permanece igual incluso si los archivos están respaldados en la carpeta C. – user204069

+0

Así que durante el Paso 3, no reemplaza los archivos porque la carpeta B (Copiado de la carpeta A) se modificó después carpeta C, por lo que el problema sigue siendo el mismo. – user204069

+0

no, no si usa sobrescribir = verdadero en el paso 3. –

2

sólo tiene que utilizar la etiqueta <copy> con un conjunto de archivos como **/* y establecer el atributo de sobreescritura en false de forma explícita. Lo uso todo el tiempo:

<copy todir="/your/target" overwrite="false"> 
    <fileset dir="/your/source" /> 
</copy> 
+0

inculde '**/*' es redundante. Eso es lo que '' hace de forma predeterminada. –

+0

Es la marca de sobrescritura = "falsa" que asegura que los archivos no se copian dos veces –

+2

Eso está mal. Sobrescribir valores predeterminados a falso, lo que tienes arriba es, de hecho, exactamente la configuración predeterminada de copia. overwrite = "false" significa que no se sobrescribe si el archivo de destino es más nuevo, siempre se sobreescribirá si el archivo de destino es anterior. – Thor84no

2

La solución simple a su problema es utilizar el parámetro de sobrescritura para el comando de copia. Esto asegurará que los archivos no se sustituyen

<copy todir="B" verbose="true" overwrite="false"> 
     <fileset dir="A"/> 
    </copy> 

El ejemplo más complicado es el uso de un conjunto de archivos selector

<copy todir="B" verbose="true"> 
     <fileset dir="A"> 
      <present targetdir="B" present="srconly"/> 
      <date datetime="01/01/2001 12:00 AM" when="after"/> 
     </fileset> 
    </copy> 

En este ejemplo he usado un selector presentepara elegir un archivo ISN' t presente en el directorio de destino (funcionalmente igual que una verificación de sobreescritura) y he agregado una condición de fecha para probar si el archivo ha sido modificado desde una fecha determinada.

La lista selector es bastante extensa.

17

Estados de atributo de sobres de la tarea de copia de Ant: "Sobrescribir archivos existentes, incluso si los archivos de destino son más recientes."

Por lo que establecerlo en falso solo evita que se sobrescriban si son más recientes, pero si los archivos originales son más nuevos, se sobrescribirán sin importar qué.

La única manera que he encontrado para evitar esto es tocar los archivos de destino antes de copiar, es decir:

<touch> 
    <fileset dir="${dest.dir}"/> 
</touch> 
<copy todir="${dest.dir}" overwrite="false"> 
    <fileset dir="${src.dir}"/> 
</copy> 
5

Mientras que <touch> obras, actualiza las fechas de archivo en el destino y, como tal, es no exactamente fiel a la solicitud.

De acuerdo con la documentación Si tiene al menos Ant 1.6.2, puede usar el atributo de granularidad.

La cantidad de milisegundos que se puede dar antes de decidir un archivo es obsoleta. Esto es necesario porque no todos los sistemas de archivos admiten siguiendo la última hora modificada al nivel de milisegundos. El valor predeterminado es 1 segundos o 2 segundos en los sistemas DOS. Esto también puede ser útil si la fuente y los archivos de destino viven en máquinas separadas con relojes que están fuera de la sincronización . desde Ant 1.6.2.

simplemente configúrelo en un número grande. Yo uso 9223372036854, que debería ser de aproximadamente 292 años (probablemente esto es suficiente). (Acabo de picado los últimos 6 dígitos fuera Long.max) que es suficiente como para no generar advertencias acerca de las fechas que están en el futuro

<copy todir="${dest.dir}" overwrite="false" granularity="9223372036854"> 
    <fileset dir="${src.dir}"/> 
</copy> 

esto garantizará que si los archivos están allí en absoluto que se ven como no lo bastante mayor por la tarea de hormigas y por lo tanto, no se ha sobrescrito (y también no tocado por otra tarea)

+0

Excelente solución. –

13

puede hacerlo de la siguiente manera:

copiar un solo archivo

<copy file="myfile.txt" tofile="mycopy.txt"/> 

copiar un solo archivo en un directorio

<copy file="myfile.txt" todir="../some/other/dir"/> 

Copiar un directorio a otro directorio

< copia TODIR = "../ nueva/dir "> < conjunto de archivos dir =" src_dir"/> </copiar>

copiar un conjunto de archivos en un directorio y más ...

, consulte este enlace para obtener más información. Copy Task

+0

¿Cómo cambiar el nombre de un archivo? –

+0

Cambia el nombre del archivo foo.jar a $ {name} - $ {version} .jar (suponiendo que el nombre y la versión son propiedades predefinidas). Si ya existe un archivo llamado $ {name} - $ {version} .jar, se eliminará antes de renombrar foo.jar. –

+0

Hola muchas gracias. Ahora la tarea está en desuso y podría usar la tarea para llevar a cabo el cambio de nombre. –

Cuestiones relacionadas