gradle - 如何使用 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
我怎样才能删除这些目录以及它们包含的文件?
解决方案
好吧,问题是 aFileTree
只对文件感兴趣,因此不会返回目录。但是,可以使用该visit
方法来迭代文件和目录。这样,您可以将解决方案简化为类似于以下内容。它使用 GradlefileTree
功能,但需要多次调用delete
:
fileTree('dir').exclude('sub_dir1').visit { delete it.file }
另一种选择是使用 Groovy 直接提供的功能:
file('dir').eachDirMatch({ !it.equals('sub_dir1') }, { delete it })
仍然需要多次调用delete
。exclude
与 Gradles的调用相比,过滤器也有点难看FileTree
。可以通过 Groovy 使用直接过滤collect
,然后可以将其放入单个delete
语句中,因为它可以处理Iterable
对象File
。但是,这很可能需要更详细的代码,所以我建议选择第一个建议的选项。
推荐阅读
- c - 如何在不使用数组的情况下找到丢失的数字?
- azure - 如何在 PowerShell azure 中启动虚拟机作为工作
- linux - Linux命令根据文件名获取最新文件
- vue.js - Vue/Nuxt:如何让组件真正动态化?
- c - 如何保护我的 linux C 程序免受盗版
- typo3 - 如何更改 TYPO3 中 fe_users 字段的长度
- authorization - Apollo 客户端 + Next.js - 向客户端请求添加授权令牌
- angular - 从Angular 8中的另一个文件导入段落
- batch-file - 从批处理变量中删除最后一个字符
- javascript - 如何避免Angular中的元素重叠元素