web-dev-qa-db-fra.com

Ant copier des fichiers sans écraser

Existe-t-il une commande dans ant pour copier des fichiers d'une structure de dossier à une autre sans vérification de la dernière date/heure de modification écraser des fichiers. Fondamentalement, je veux tous les fichiers supplémentaires du dossier A vers le dossier B. C'est-à-dire: aucun fichier du dossier B n'est remplacé mais les fichiers supplémentaires du dossier A arrivent dans le dossier B.

J'ai vu les commandes "copie de fourmi" et "déplacement de fourmi", mais je n'ai pas aidé. Aucune suggestion.

18
user204069

L'attribut d'écrasement de la tâche de copie d'Ant indique: "Écraser les fichiers existants même si les fichiers de destination sont plus récents."

Ainsi, le définir sur false empêche uniquement leur écrasement s'ils sont plus récents, mais si les fichiers d'origine sont plus récents, ils écrasent quoi qu'il arrive.

Le seul moyen que j'ai trouvé pour contourner ce problème est de toucher les fichiers de destination avant de les copier, c'est-à-dire:

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

vous pouvez le faire comme ci-dessous:

Copier un seul fichier

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

Copier un seul fichier dans un répertoire

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

Copier un répertoire dans un autre répertoire

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

Copiez un ensemble de fichiers dans un répertoire et plus encore ...

veuillez consulter ce lien pour plus d'informations . Copier la tâche

16
Ali Tofigh

Tandis que <touch> fonctionne, il met à jour les dates des fichiers dans la destination et en tant que tel, il n'est pas exactement conforme à la demande.

Selon la documentation Si vous avez au moins Ant 1.6.2, vous pouvez utiliser l'attribut de granularité.

Le nombre de millisecondes de marge à donner avant de décider qu'un fichier est obsolète. Cela est nécessaire car tous les systèmes de fichiers ne prennent pas en charge le suivi de la dernière heure de modification au niveau de la milliseconde. La valeur par défaut est 1 seconde ou 2 secondes sur les systèmes DOS. Cela peut également être utile si les fichiers source et cible vivent sur des machines distinctes avec des horloges désynchronisées. depuis Ant 1.6.2.

réglez-le simplement sur un grand nombre. J'utilise 9223372036854, qui devrait durer environ 292 ans (probablement cela suffit). (Je viens de couper les 6 derniers chiffres de Long.max), ce qui est suffisant pour ne pas générer d'avertissements sur les dates futures

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

cela garantira que si les fichiers sont là du tout ils seront considérés comme pas assez vieux par la tâche fourmis et donc, pas écrasés (et pas non plus touchés par une autre tâche)

7
Beta033

S'il n'y a pas de solution élégante, vous pouvez toujours le faire dans une séquence:

  1. <move> dossier <B> à <C>
  2. <copy> fichiers du dossier <A> à <B>
  3. <copy> fichiers du dossier <C> à <B> en utilisant overwrite=true

(Faites les choses dans l'autre sens, en remplaçant les nouveaux fichiers, pas les anciens)

3
Sean Patrick Floyd

La solution simple à votre problème consiste à utiliser le paramètre overwrite dans la commande de copie. Cela garantira que les fichiers ne sont pas remplacés

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

L'exemple le plus compliqué consiste à utiliser un ensemble de fichiers sélecteur

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

Dans cet exemple, j'ai utilisé un sélecteur present pour choisir un fichier qui n'est pas présent dans le répertoire cible (fonctionnellement identique à un contrôle d'écrasement) et J'ai ajouté une condition supplémentaire date pour tester si le fichier a été modifié depuis une certaine date.

La liste sélecteur est assez étendue.

2
Mark O'Connor

Utilisez simplement le <copy> tag avec un ensemble de fichiers comme **/* et définissez explicitement l'attribut overwrite sur false. Je l'utilise tout le temps:

<copy todir="/your/target" overwrite="false">
  <fileset dir="/your/source" />
</copy>
2
Joeri Hendrickx