如何使用Gradle删除排除某些子目录的目录树?

时间:2019-04-10 10:15:41

标签: gradle

我的目录结构如下:

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 -|
     |           |
     |           - file2
     |
     - sub_dir3 -|
                 |
                 - file3

我要递归删除dir以外的所有内容sub-dir1

因此,预期的结果目录结构应如下所示:

dir -|
     |
     - sub_dir1 -|
                 |
                 - file1

我尝试了以下代码,它删除了sub_dir1内容之外的所有文件。但是,它不会删除其他子目录,而只会删除那些目录中的文件。

  delete fileTree(dir: "dir1").exclude("sub_dir1").include('**/**')

以上代码的结果:

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 
     |           
     |
     - sub_dir3

如何删除这些目录及其包含的文件?

2 个答案:

答案 0 :(得分:1)

好吧,问题在于high - low >=k只对文件感兴趣,因此不会返回目录。但是,可以使用FileTree方法来迭代文件和目录。这样,您可以简化解决方案,使其类似于以下内容。它使用Gradle visit功能,但需要多次调用fileTree

delete

另一个选择是使用Groovy直接提供的功能:

fileTree('dir').exclude('sub_dir1').visit { delete it.file }

仍然需要多次调用file('dir').eachDirMatch({ !it.equals('sub_dir1') }, { delete it }) 。与Gradles delete的{​​{1}}调用相比,该过滤器还比较丑陋。可以通过Groovy exclude使用直接过滤,然后可以将其放入单个FileTree语句中,因为它可以处理collect个对象中的delete个。但是,这很可能需要更多详细的代码,因此我建议选择建议的第一个选项。

答案 1 :(得分:0)

目前,我设法使用以下代码实现了自己的要求:

Arrays.stream(new File("dir").list()).forEach {
  f -> if (f != "sub_dir1") {
    delete "dir/${f}"
  }
}

欢迎采用更好的方法。