如何使用Ant复制目录


99

我曾经copydir复制过一个目录树,但是已经过时了。我的目录包含一些子目录,其中一些包含文件,另一些包含更多子目录。

如何复制整棵树?


5
听起来好像您想进行递归复制。这就是Omnipresent提供的解决方案。如果在问题中出现“递归”一词,可能会有更多的人找到这个问题。
杰森

Answers:


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

相信可以做到您想要的...(递归复制已完成)


3
显然,includes当您需要所有内容时,这不是必需的(请参阅用户s1n的答案)
Abel 2010年

40
这将复制{src.dir}的内容,而不是实际目录的内容
cmcginty 2013年

复制不是做,而是内容。
A直播

由于您已经接受了答案,因此您可以将其更正为正确答案(ery的答案正确);-)
Christian Fries

我认为SO的想法是集体策展,这就是为什么任何人都可以编辑别人的问题的原因(尽管您需要很多代表才能跳过编辑评论)。
Andrew Spencer

117

复制内容,包括目录本身。

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

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


12
这应该是正确的答案。另一个答案是关于“如何使用Ant复制目录内容”的问题。有细微的差别。
cmcginty 2013年

“这应该是正确的答案”:绝对可以,但是当您无法使用预期的路径名加载资源时,差别并不那么微妙。
Jim Pivarski 2013年

1
它对ant 1.8无效,似乎什么也没发生。
CCC

8
@CCC确保$ {src.dir} 对于$ {src.dir.parent},而不是完整路径
Mike Demenok,2016年

非常误导如何x.parent应该不是parentx...... -_-
nonchip

25

您只需要指定目录(不包含include属性):

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

有关更多详细信息和示例,请参见手册


13
@ s1n此命令仅将src_dir的所有内容复制到../new/dir,而不是src_dir。我们如何将src_dir(目录)复制到另一个位置?
2011年


2

重点:只有源文件比目标文件新时,ant才会复制子目录。 [1]在我的情况下,未复制子目录(我使用的是verbose =“ true”),因为没有更改并且它们已经在目标位置了。您可以使用“覆盖”来强制执行此操作,也可以触摸源子目录中的某些文件。


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>

1

此处的示例中,您可以使用复制任务编写一个简单的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

1

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

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

有关详细信息,请参见模式


1

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

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

0

我终于使用以下代码复制了

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

这会将src文件夹从dist复制到版本号。

希望这对某人有帮助。


它从字面上说它会复制相反的方式:P
芯片,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.