繁体   English   中英

Ant复制文件没有覆盖

[英]Ant copy files without overwriting

在ant中是否有任何命令将文件从一个文件夹结构复制到另一个文件夹结构而不检查上次修改的日期/时间覆盖文件。 基本上我想要从文件夹A到文件夹B的所有额外文件。即: 没有文件夹B的文件被替换,但文件夹A的额外文件到达文件夹B.

我看到了“蚂蚁复制”和“蚂蚁移动”命令,但没有帮助。 有什么建议。

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

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

我发现解决这个问题的唯一方法是在复制之前触摸目标文件,即:

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

你可以这样做:

复制单个文件

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

将单个文件复制到目录

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

将目录复制到另一个目录

<copy todir =“../ new / dir”> <fileset dir =“src_dir”/> </ copy>

将一组文件复制到一个目录以及更多...

请参阅此链接以获取更多信息。 复制任务

<touch>有效时,它会更新目标中的文件日期,因此对请求不完全正确。

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

在决定文件之前给出的毫秒数是过时的。 这是必需的,因为并非每个文件系统都支持将上次修改时间跟踪到毫秒级别。 在DOS系统上默认为1秒或2秒。 如果源文件和目标文件位于时钟不同步的不同计算机上,这也很有用。 自Ant 1.6.2起。

只需将其设置为大数。 我用的是9223372036854,应该是292年左右(可能这已经足够了)。 (我只是砍掉了Long.max的最后6位数字),这足以不会产生有关未来日期的警告

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

这将保证如果文件完全存在他们将被蚂蚁任务看作不够老,因此,不会被覆盖(也不会被其他任务触及)

如果没有优雅的解决方案,您可以按顺序执行:

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

(做反过来的事情,替换新文件,而不是旧文件)

只需将<copy>标记与文件集一起使用为**/* ,并将overwrite属性显式设置为false。 我经常用这个:

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

解决问题的简单方法是使用overwrite参数复制命令。 这将确保不替换文件

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

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

选择器列表相当广泛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM