首页 > 解决方案 > 如何使用 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

我怎样才能删除这些目录以及它们包含的文件?

标签: gradle

解决方案


好吧,问题是 aFileTree只对文件感兴趣,因此不会返回目录。但是,可以使用该visit方法来迭代文件和目录。这样,您可以将解决方案简化为类似于以下内容。它使用 GradlefileTree功能,但需要多次调用delete

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

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

file('dir').eachDirMatch({ !it.equals('sub_dir1') }, { delete it })

仍然需要多次调用deleteexclude与 Gradles的调用相比,过滤器也有点难看FileTree。可以通过 Groovy 使用直接过滤collect,然后可以将其放入单个delete语句中,因为它可以处理Iterable对象File。但是,这很可能需要更详细的代码,所以我建议选择第一个建议的选项。


推荐阅读