Ant копирует файлы без перезаписи - PullRequest
18 голосов
/ 17 августа 2010

Есть ли в ant команда для копирования файлов из одной структуры папок в другую без проверки последней измененной даты / времени перезаписи файлов. В основном я хочу, чтобы все дополнительные файлы из папки A в папку B. То есть: файлы папки B не заменялись, но дополнительные файлы папки A попадают в папку B .

Я видел команды "ant copy" и "ant move", но это не помогло. Любые предложения.

Ответы [ 6 ]

18 голосов
/ 26 июля 2011

Атрибут перезаписи задачи копирования Ant: Msgstr "Перезаписать существующие файлы, даже если файлы назначения более новые."

Таким образом, установка его в false только предотвращает их перезапись, если они новее, но если исходные файлы новее, они перезаписывают независимо от того, что.

Единственный способ обойти это - прикоснуться к целевым файлам перед копированием, то есть:

<touch>
  <fileset dir="${dest.dir}"/>
</touch>
<copy todir="${dest.dir}" overwrite="false">
  <fileset dir="${src.dir}"/>
</copy>
16 голосов
/ 03 сентября 2014

Вы можете сделать это, как показано ниже:

Скопировать один файл

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

Скопировать один файл в каталог

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

Скопировать каталог в другойсправочник

Скопируйте набор файлов в каталог и многое другое ...

см. Эту ссылку для получения дополнительной информации. Копировать задачу

6 голосов
/ 31 января 2012

Пока работает <touch>, он обновляет даты файла в месте назначения, и поэтому он не совсем соответствует запросу.

Согласно документации. Если у вас есть хотя бы Ant 1.6.2, вы можете использовать атрибут granularity.

Количество миллисекунд, которое нужно дать, прежде чем принять решение о файле устаревший. Это необходимо, потому что не каждая файловая система поддерживает отслеживание последнего измененного времени до миллисекундного уровня. По умолчанию 1 секунда или 2 секунды в системах DOS. Это также может быть полезно, если источник и целевые файлы живут на отдельных машинах с часами вне синхронизации. начиная с Ant 1.6.2.

просто установите его на большое число. Я использую 9223372036854, что должно быть около 292 лет (вероятно, этого достаточно). (Я только что отрубил последние 6 цифр от Long.max), что достаточно, чтобы не генерировать предупреждения о датах на будущее

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

это будет гарантировать, что если файлы есть на всех , они будут считаться недостаточно старыми для задачи ant и, следовательно, не будут перезаписаны (и также не затронуты другой задачей)

3 голосов
/ 17 августа 2010

Если нет элегантного решения, вы всегда можете сделать это в последовательности:

  1. <move> папка <B> до <C>
  2. <copy> файлов папки <A> до <B>
  3. <copy> файлы папки <C> - <B> с использованием overwrite=true

(Делайте все наоборот, заменяя новые файлы, а не старые)

2 голосов
/ 18 августа 2010

Простое решение вашей проблемы - использовать параметр overwrite в команде copy. Это гарантирует, что файлы не будут заменены

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

Более сложный пример - использование набора файлов селектор

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

В этом примере я использовал селектор present , чтобы выбрать файл, которого нет в целевом каталоге (функционально такой же, как проверка перезаписи), и добавил дополнительный date условие для проверки, был ли файл изменен с определенной даты.

Список селектор довольно обширный.

2 голосов
/ 17 августа 2010

Просто используйте тег <copy> с набором файлов как **/* и явно установите для атрибута перезаписи значение false.Я использую это все время:

<copy todir="/your/target" overwrite="false">
  <fileset dir="/your/source" />
</copy>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...