Ant - 仅从树上的一个子目录复制文件和子目录

时间:2011-06-21 18:28:53

标签: ant

我想从单个子目录中使用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

感谢。

2 个答案:

答案 0 :(得分:18)

这并不困难......

<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目录,其中包含这些目录下的所有文件(和目录树)。

答案 1 :(得分:1)

<copy todir="/some/path/foobar" verbose="true">
  <fileset dir="/some/path/temp/dir2" includes="**"/>
</copy>

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