如何使用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
方法迭代文件和目录。通过这种方式,您可以将您的解决方案简化为类似以下内容。它使用GradlefileTree
功能,但需要多次调用delete
:
fileTree('dir').exclude('sub_dir1').visit { delete it.file }
另一种选择是使用Groovy直接提供的功能:
file('dir').eachDirMatch({ !it.equals('sub_dir1') }, { delete it })
仍然需要多次调用delete
。另外,与GradlesFileTree
的exclude
调用相比,过滤器有点难看。可以通过Groovycollect
使用直接过滤,然后可以将其放入一个delete
语句中,因为它可以处理文件
对象的可编辑
。但是,这很可能需要更详细的代码,因此我建议选择建议的第一个选项