2011-05-09 7 views
7

Me gusta mucho la tarea de sincronización de Ant, pero lo que tengo que hacer es copiar archivos de una carpeta de origen a una carpeta de destino según si el contenido del archivo de destino coincide con el contenido del archivo de origen, en lugar de verificar la fecha de modificación del archivo (que es lo que hace actualmente la 'sincronización'). ¿Hay alguna forma de lograr esto? Noté que hay un comparador Ant para el contenido del archivo, así como una tarea de 'suma de comprobación' que puede ser útil.Cómo usar la tarea de "sincronización" de Ant, pero según el contenido del archivo

Gracias!

+0

alguna vez la posibilidad de llamar rsync para llevar a cabo la operación de sincronización? – ewh

+1

Gracias por la idea. Estaba buscando una solución basada en hormigas si es posible. –

Respuesta

5

Para cualquier otra persona que llega a esto y necesita código, aquí es una tarea para la sincronización de un lugar con otro basado en el contenido en lugar de marca de tiempo, utiliza un selector modificado en lugar de la de selección diferente en la otra respuesta a dará más control sobre cómo se calculan las diferencias de archivo:

<project name="Demo" default="newSync"> 
    <description> 
    Sync from ${foo} to ${bar} 
    </description> 

    <macrodef name="syncContents"> 
    <attribute name="from"/> 
    <attribute name="to"/> 
    <sequential> 
     <fileset id="selectCopyFiles" dir="@{from}"> 
     <modified algorithm="hashvalue"/> 
     </fileset> 
     <fileset id="selectDeleteFiles" dir="@{to}"> 
     <not> 
      <present targetdir="@{from}"/> 
     </not> 
     </fileset> 

     <copy overwrite="true" todir="@{to}"> 
     <fileset refid="selectCopyFiles"/> 
     </copy> 
     <delete includeEmptyDirs="true"> 
     <fileset refid="selectDeleteFiles"/>    
     </delete> 
    </sequential> 
    </macrodef> 

    <target name="newSync"> 
    <syncContents from="${foo}" to="${bar}"/> 
    </target> 
</project> 

Tenga en cuenta que esto hace foo espejo del bar (sincronización A-> B), si desea una sincronización bidireccional puede reemplazar el borrar con una copia de B-> A, y proporciona una tarea de concat para tratar los cambios en el mismo archivo en ambas ubicaciones.

1

¡Gracias por esta tarea!

Sin embargo, el catálogo de archivos selectCopyFiles era incorrecto. También tengo otra solución para el conjunto de archivos selectDeleteFiles.

Aquí está el nuevo código de la macrodef:

<macrodef name="syncContents"> 
    <attribute name="from"/> 
    <attribute name="to"/> 
    <sequential> 
     <echo>syncContents  : @{from} -> @{to}</echo> 
     <fileset id="selectCopyFiles" dir="@{from}"> 
      <different targetdir="@{to}" 
      ignoreFileTimes="true"/> 
     </fileset> 
     <fileset id="selectDeleteFiles" dir="@{to}"> 
      <present present="srconly" targetdir="@{from}"/> 
     </fileset> 

     <copy overwrite="true" todir="@{to}" preservelastmodified="true" verbose="true"> 
      <fileset refid="selectCopyFiles"/> 
     </copy> 
     <delete includeEmptyDirs="true" verbose="true"> 
      <fileset refid="selectDeleteFiles"/> 
     </delete> 
     <echo>End syncContents : @{from} -> @{to}</echo> 
    </sequential> 
</macrodef> 
Cuestiones relacionadas