【问题标题】:Ant -- copying files and subdirectories from only one subdirectory on a treeAnt——只从树上的一个子目录复制文件和子目录
【发布时间】:2011-06-21 18:28:52
【问题描述】:

我想使用 Ant 从单个子目录复制文件和子目录,而不复制目录结构和内容的其余部分。例如,我想复制 dir_3、它的文件(file_1 到 file_n)和子目录(dir_4 和 dir_5),但不复制 dir_1 和 dir_2。有没有我可以用来执行此操作的模式?

temp
   \--dir_1
   \--dir_2
       |
       \--dir_3
           |
           \--dir_4
           \--dir_5
           \-- file_1
           |
           \--file_n

谢谢。

【问题讨论】:

    标签: ant


    【解决方案1】:
    <copy todir="${copy.dir}">
         <fileset dir="temp">
             <include name="**/dir3/**"/>
         </fileset>
    </copy>
    

    当您使用include 指令时,它只会包含与您指定的模式匹配的文件。在这种情况下,我只复制那些在其完整路径名中某处具有/dir3/ 的文件。这包括dir3 下的子目录和dir3 下的所有文件。

    您可以使用exclude 指令覆盖include 指令:

    <copy todir="${copy.dir}">
         <fileset dir="temp">
             <include name="**/dir3/**"/>
             <exclude name="**/dir3/*"/>
         </fileset>
    </copy>
    

    这将复制这些子目录中的所有子目录和文件,但不会复制dir3 本身下的文件。 * 匹配目录中的所有文件,而** 匹配整个目录树中的所有文件。

    请注意,这将创建一个目录temp/dir2/dir3。如果我想要temp/dir3,我必须将我的文件集设置为dir3的父目录:

    <copy todir="${copy.dir}">
         <fileset dir="temp/dir2">
             <include name="dir3/**"/>
         </fileset>
    </copy>
    

    这样做:

    <copy todir="${copy.dir}">
         <fileset dir="temp/dir2/dir3"/>
    </copy>
    

    将创建一个目录temp,其中包含直接在dir3 下的所有文件,直接在temp 下。还有一个temp/dir4temp/dir5 目录,其中包含这些目录下的所有文件(和目录树)。

    【讨论】:

      【解决方案2】:
      <copy todir="/some/path/foobar" verbose="true">
        <fileset dir="/some/path/temp/dir2" includes="**"/>
      </copy>
      

      只需使用从 dir2 开始的文件集,包括下面的所有目录和文件..
      verbose = true 回显所有复制的文件
      如果 todir
      指定的目录,您可能还需要使用 overwrite = true 属性已经存在,否则复制任务不会覆盖现有文件

      【讨论】: