如何使用Ant复制一个目录

110

我使用过copydir来复制一个目录树,但是它已经被弃用了。我的目录包含一些子目录,其中有的包含文件,有的包含更多的子目录。

我该如何复制整个树?


5
似乎你想要进行递归复制。这就是Omnipresent给出的解决方案。如果在问题中出现“递归”这个词,更多的人可能会找到这个问题。 - Jason
11个回答

129

复制包括目录本身在内的所有内容。

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

注意:${src.dir} 是相对于 ${src.dir.parent} 而不是完整路径。

12
这应该是正确答案。其他答案是针对问题“如何使用Ant复制目录的内容”的。两者有微妙的区别。 - cmcginty
这应该是正确的答案:当你无法使用预期的路径名加载资源时,虽然差异并不那么微妙。 - Jim Pivarski
1
它在ant 1.8上无法工作,似乎什么也没有发生。 - CCC
8
@CCC 确保 ${src.dir} 是相对于 ${src.dir.parent} 的路径,而不是一个完整的路径。 - Mike Demenok
最好包括@MikeDemenok的评论。在我加上那个之前,它对我不起作用,但是加上之后就可以了。 - Zack Macomber
显示剩余2条评论

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

我相信这将实现你想要的...(递归复制完成)


4
据用户s1n的回答,当你想要获取所有东西时,显式地使用includes并不是必需的。 - Abel
44
这将复制{src.dir}的内容,但不包括实际目录。 - cmcginty
复制的不是物品而是内容。 - A-Live
既然你成为了被接受的答案,那么你可以纠正它,使其成为正确的答案(ery的答案是正确的);-) - Christian Fries
我理解的SO的想法是集体策展,这就是为什么任何人都可以编辑其他人的问题(尽管您需要很高的声望来跳过编辑审核)。 - Andrew Spencer
被采纳的答案并不一定是正确答案,而只是帮助 OP 的答案。改变被采纳答案的本质并不一定是一个好主意。得到最多积分的答案应该是正确的答案。 - Lindlof

26

你只需要指定目录(不包括includes属性):

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

查看手册以获取更多详细信息和示例。


13
这个命令只会将src_dir目录下的所有内容复制到../new/dir,而不是整个src_dir目录。如何将src_dir目录复制到另一个位置? - Pipalayan Nayak

17

复制包括目录本身在内的所有内容。

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

2
这是最简洁的选项。另请参阅http://ant.apache.org/manual/Types/fileset.html。 - Jess

2
我在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>

2
一个细节:只有当源文件比目标文件更新时,Ant 才会复制子目录。在我的情况下,由于没有更改且子目录已经存在于目标位置中(我使用 verbose="true"),因此子目录未被复制。您可以使用 "overwrite" 强制复制,或者触摸源子目录中的某些文件。 [1]

1

从这个 例子 中,你可以使用拷贝任务编写一个简单的 Ant 文件。

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

这个命令会将src_dir中的所有内容(但不包括它本身)复制到new/dir目录中。


6
这只是复制目录的内容,而不是包括目录本身的内容。 :( - ghostCoder

1
我正在添加一个更通用的模式来复制所有子文件夹。
<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir}" includes="**/*"/>
</copy>

请参阅Patterns以获取详细信息。

我应该用什么替换dest.dir和src.dir?我有将近6个目录要复制到dest dir并创建一个war文件,然后在tomcat服务器上部署它。 - deepakl.2000
@deepakl.2000 - 注意,${...} 结构表示我们正在使用你在脚本中定义的 Ant 变量。请参阅 https://ant.apache.org/manual/using.html#properties。 - sartoris

1
另一个与编程有关的任务是复制目录。关键部分在于在目标目录后包含您要复制的目录名称。子目录和文件将自动复制。
<target name="-post-jar">
    <copydir src="config" dest="${dist.dir}/config/"/>
</target>

从您的链接中:此任务已被弃用。请改用复制任务。 - Jim

0

这段代码应该复制文件夹及其内容。它还使用basename任务来避免手动路径解析。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接