我想从单个子目录中使用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
感谢。
答案 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/dir4
和temp/dir5
目录,其中包含这些目录下的所有文件(和目录树)。
答案 1 :(得分:1)
<copy todir="/some/path/foobar" verbose="true">
<fileset dir="/some/path/temp/dir2" includes="**"/>
</copy>
只需使用从dir2开始的文件集,包括下面的所有目录和文件。
verbose = true表示回显所有复制的文件
如果由todir指定的目录,也可能需要使用overwrite = true
属性已存在,否则复制任务不会覆盖现有文件