如何使用Gradle删除不包括特定子目录的目录树?

如何使用Gradle删除不包括特定子目录的目录树?,gradle,Gradle,我的目录结构如下: dir -| | - sub_dir1 -| | | | - file1 | - sub_dir2 -| | | | - file2 | - sub_dir3 -| | - file3 dir -| | - s

我的目录结构如下:

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 -|
     |           |
     |           - file2
     |
     - sub_dir3 -|
                 |
                 - file3
dir -|
     |
     - sub_dir1 -|
                 |
                 - file1
我想递归删除
dir
的所有内容,除了
sub-dir1

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

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 -|
     |           |
     |           - file2
     |
     - sub_dir3 -|
                 |
                 - file3
dir -|
     |
     - sub_dir1 -|
                 |
                 - file1
我尝试了以下代码,它删除了除
sub_dir1
的内容之外的所有文件。但是,它不会删除其他子目录,而只删除这些目录中的文件

  delete fileTree(dir: "dir1").exclude("sub_dir1").include('**/**')
上述代码的结果:

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

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

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

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

欢迎使用更好的方法。

好吧,问题是
文件树只对文件感兴趣,所以不会返回目录。但是,可以使用
visit
方法迭代文件和目录。通过这种方式,您可以将您的解决方案简化为类似以下内容。它使用Gradle
fileTree
功能,但需要多次调用
delete

fileTree('dir').exclude('sub_dir1').visit { delete it.file }
另一种选择是使用Groovy直接提供的功能:

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