2010-08-17 213 views
16

蚂蚁有任何命令将文件从一个文件夹结构复制到另一个没有检查上次修改日期/时间覆盖文件。基本上我想从文件夹A到文件夹B的所有额外文件。即:文件夹B的任何文件都被替换,但文件夹A的额外文件来到文件夹B蚂蚁复制文件

我看到“ant copy”和“ant move”命令,但没有帮助。有什么建议么。

+3

你试过用overwrite =“true”来使用ant copy吗? – 2010-08-17 13:38:42

+0

请问为什么你添加了maven-2标签?你在谈论嵌入maven的蚂蚁吗? – 2010-08-17 13:50:59

+0

大多数使用maven的人都来自蚂蚁背景,除此之外你是对的,我总是可以在蚂蚁中嵌入maven。 – user204069 2010-08-17 14:06:15

回答

3

如果没有一个很好的解决方案,你总是可以做一个序列:

  1. <move>文件夹<A><B><C>
  2. <copy>文件夹<C><B>
  3. <copy>文件到<B>使用overwrite=true

(做事的其他方式,取代了新的文件,而不是旧的)

+0

这没有帮助,因为即使将文件备份到文件夹C中,上次修改日期时间仍保持不变。 – user204069 2010-08-17 14:48:56

+0

因此,在步骤3期间,由于文件夹B(从文件夹A复制)文件被修改文件夹C,所以问题保持不变。 – user204069 2010-08-17 14:51:16

+0

不,如果在步骤3中使用overwrite = true。 – 2010-08-17 15:07:02

2

只需使用<copy>标签与文件集**/*和覆盖属性明确设置为false。我一直都在使用它:

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

inculde'**/*'是多余的。这就是''默认做的。 – 2010-08-18 16:41:45

+0

这是overwrite =“false”标志,确保文件不被复制两次 – 2010-08-18 19:07:20

+2

这是错误的。覆盖默认为false,上面的内容其实就是复制的默认设置。 overwrite =“false”表示如果目标文件较新,则不覆盖,如果目标文件较旧,则它总是覆盖。 – Thor84no 2011-12-08 11:17:25

2

问题的简单解决方案是使用覆盖参数复制命令。这将确保文件不会被替换

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

更复杂的例子是使用文件集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> 

在这个例子中,我使用了目前选择器选择一个文件ISN” (在功能上与覆盖检查相同),并且我添加了额外的日期条件以测试自某个日期以来文件是否已被修改。

selector列表相当广泛。

17

Ant的复制任务的覆盖属性状态: “即使目标文件较新,也覆盖现有文件”。

因此,将其设置为false只会防止它们被覆盖,如果它们较新,但如果原始文件较新,则无论如何覆盖它们。

我找到解决这个问题的唯一方法是复制前触及目标文件,即:

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

虽然<touch>作品,它会更新文件日期中的目的地,因此它是不完全符合要求。

根据文档如果您至少有Ant 1.6.2,则可以使用粒度属性。

在决定文件之前给出的毫秒数是 过期。这是必需的,因为不是每个文件系统都支持 跟踪上次修改时间到毫秒级别。 DOS系统上的默认值为1秒钟,即2秒钟,即2秒钟。如果源 和目标文件位于不同的计算机上,且时钟超出 同步,则此功能也可能非常有用。自从Ant 1.6.2以来。

只是将它设置为一个很大的数字。我使用9223372036854,这应该是大约292年(可能这已经足够了)。 (我只是切碎后6位断Long.max),这是够不产生有关日期在未来是

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

这将保证文件是否存在在所有他们将看到警告因为没有蚂蚁的任务,因此足够大,不会被覆盖(也没有被其他任务感动)

+0

优秀的解决方案。 – 2015-12-28 19:39:25

13

你可以做如下:

复制一个文件

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

复制一个文件到一个目录

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

复制一个目录到另一个目录

<拷贝todir = “../新/目录 ”> <文件集DIR =“ src_dir”/ > < /复制>

复制的一组文件的目录和更多...

请参阅此链接了解更多信息。 Copy Task

+0

如何重命名文件? – 2015-07-31 20:15:14

+0

将文件foo.jar重命名为$ {name} - $ {version} .jar(假设名称和版本是预定义的属性)。 如果一个名为$ {name} - $ {version} .jar的文件已经存在,它将被删除在重命名foo.jar之前。 – 2015-08-02 03:54:17

+0

非常感谢。现在任务已过时,我可以使用任务完成重命名。 – 2015-08-02 04:56:48