2009-11-06 68 views
87

我已经使用copydir来复制目录树,但不推荐使用。我的目录包含一些子目录,其中一些包含文件,其他包含更多的子目录。如何使用Ant复制目录

如何复制整个树?

+5

听起来像你想做一个递归的副本。这就是Omnipresent提供的解决方案。如果在问题中出现“递归”这个词,更多的人可能会发现这个问题。 – Jason 2012-04-26 18:28:08

回答

101
<copy todir="${dest.dir}" > 
    <fileset dir="${src.dir}" includes="**"/> 
</copy> 

相信会做你想要什么......(递归复制完成)

+2

显然,当你想要所有东西时,'includes'不是必需的(请参阅用户* s1n *的回答) – Abel 2010-08-17 07:13:17

+30

这复制{src.dir}的内容,但不包含实际目录 – cmcginty 2013-01-26 00:42:17

+0

复制件不是一个,而是它的内容。 – 2013-05-30 19:15:17

23

您应该只有指定的目录(SAN的包括属性):

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

manual以获取更多详细信息和示例。

+12

@ s1n该命令仅将src_dir的所有内容复制到../new/dir而不是src_dir。我们如何将src_dir(目录)复制到另一个位置? – 2011-12-03 19:24:53

1

从示例here可以使用复制任务编写一个简单的Ant文件。

<project name="MyProject" default="copy" basedir="."> 
    <target name="copy"> 
     <copy todir="./new/dir"> <fileset dir="src_dir"/> </copy> 
    </target> 
</project>

src_dir(不含吧)new/dir这应该复制一切。

+6

这只是复制目录的内容。不包括直接的内容。 。:( – ghostCoder 2011-11-21 07:55:08

87

复制包含目录本身的内容。

<copy todir="${dest.dir}" > 
    <fileset dir="${src.dir.parent}"> 
     <include name="${src.dir}/**"/> 
    </fileset> 
</copy> 
+10

这应该是正确的答案对方回答是这个问题:“你怎么拷贝一个目录的使用Ant的内容”有细微的差别 – cmcginty 2013-01-26 00:41:12

+0

“这应该是正确答案”:。当然,虽然当你无法使用预期的路径名加载你的资源时,差异并不那么微妙。 – 2013-07-10 18:48:15

+1

它不适用于ant 1.8,它似乎什么也没有发生。 – CCC 2016-01-19 09:27:24

1

一个很好的观点:如果源文件比目标文件更新,ant将只复制子目录。 [1]在我的情况下,sub-dirs没有被复制(我使用verbose =“true”),因为没有变化,它们已经在目的地。您可以使用“覆盖”来强制它,或者触摸源代码子目录中的一些文件。

10

复制包含目录本身的内容。

<copy todir="${dest.dir}" > 
    <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/> 
</copy> 
+1

这是最简洁的选项也http://ant.apache.org/manual/Types/fileset.html – Jess 2014-04-09 03:29:38

0

此代码应复制文件夹以及其内容。它还使用基本名称任务来避免必须执行任何手动路径分析。

<project name="Build" default="doCopy"> 
    <property name="source.dir" value="SourceDirPathGoesHere"/> 
    <property name="dest.dir" value="DestinationDirPathGoesHere"/> 
    <target name="doCopy"> 
    <basename property="source.dir.base.name" file="${source.dir}"/> 
    <copy todir="${dest.dir}"> 
     <fileset dir="${source.dir}/.." includes="${source.dir.base.name}/**"/> 
    </copy> 
    </target> 
</project> 
0

我用下面的代码

<copy todir="${root.dir}/dist/src"> 
       <fileset dir="${root.dir}/build/src" includes="**"/> 
      </copy> 

这将从DIST建立复制src文件夹最终被复制。

希望这可以帮助别人。

1

我添加了一个更通用的模式来复制所有子文件夹。

<copy todir="${dest.dir}" > 
    <fileset dir="${src.dir}" includes="**/*"/> 
</copy> 

查看Patterns了解详情。

1

我使用了include标签,如下面的代码片段所示,在我的build.xml文件中复制个别jar文件到目录中。

<target name="devInstall" depends="generateXsl" description="testing"> 
<copy flatten="true" todir="${test}/WEB-INF/lib" overwrite="${overwrite}"> 
       <fileset refid="buildJars"/> 
       <fileset dir="lib"> 
        <include name="commons-collections-*.jar"/> 
        <include name="commons-io-*.jar"/>    
        <include name="kodo/*.jar"/> 
        <include name="mail*.jar"/>  
        <include name="activation*.jar"/>    
        <include name="guava*.jar"/> 
        <include name="jna*.jar"/>       
       </fileset>   
      </copy> 
</target> 
1

另一个蚂蚁的任务是Copydir。这里的关键部分是包含要在dest目录之后复制的目录的名称。子目录和文件将被自动复制。

<target name="-post-jar"> 
    <copydir src="config" dest="${dist.dir}/config/"/> 
</target> 
+0

看到你的链接:。**此任务已被弃用。使用复印任务,而不是**。 – Jim 2017-10-25 19:38:06