gpt4 book ai didi

gradle - Gradle:如何将绝对路径列表复制到单个目录中

转载 作者:行者123 更新时间:2023-12-03 03:08:01 28 4
gpt4 key购买 nike

在Gradle中,我试图将绝对路径列表复制到单个目录中,但是我想将绝对路径的最后一个部分保留为目标目录的子文件夹。

目前我有:

def copyTask = tasks.create(name: "copyFolders", type: Copy, overwrite: true) {
from ["/sources/a-1/first", "/sources/a-3/b-1/c-1/second"]
into "/destination"
}

但这导致 /sources/foo/bar/sources/one/two/three/path中包含的文件被复制到 /destination中。相反,我希望 /destination包含 barpath文件夹(它们的内容都在其中)。

它应该能够正确处理这种情况:
sources
├── a-1
│   └── fist
│   └── lorem.txt
| └── subfolder
│   └── lorem2.txt
├── a-2
│   └── fist-b
│   └── lorem.txt
| └── subfolder
│   └── lorem2.txt
└── a-3
└── b-1
└── c-1
└── second
└── ipsum.log

->
destination
├── first
│   └── lorem.txt
│   └── subfolder
│   └── lorem2.txt
└── path
└── ipsum.log

基于@szymon的答案,我得到了:
def copyTask = tasks.create(name: "copyToDestDir", type: Copy, overwrite: true) {
includeEmptyDirs = false
def fromDir = "/sources"
def sourcePaths = ["/sources/a-1/first", "/sources/a-3/b-1/c-1/second"]
from fileTree(fromDir).dir.listFiles()
eachFile { copySpec ->
def shouldBeCopied = false
sourcePaths.find {
if (copySpec.getFile().getCanonicalPath().startsWith(it)) {
shouldBeCopied = true
return true // break iteration
}
}
if (shouldBeCopied) {
String[] parts = file.path.split('/')
copySpec.path = parts.size() > 1 ? "${parts[parts.size() - 2]}/${parts[parts.size() - 1]}" : parts[0]
} else {
copySpec.exclude()
}
}
into destDir
}

但这错误地导致:
destination
├── first
│   └── lorem.txt
└── subfolder
│   └── lorem2.txt
└── path
└── ipsum.log

如何实现呢?

最佳答案

尝试执行以下Gradle任务:

task copyFiles(type: Copy, overwrite: true) {
includeEmptyDirs = false
from fileTree("sources").dir.listFiles()
eachFile { file ->
String[] parts = file.path.split('/')
file.path = parts.size() > 1 ? "${parts[parts.size() - 2]}/${parts[parts.size() - 1]}" : parts[0]
}
into "destDir"
}

整个部分发生在 eachFile {}闭包中,在其中我们指定了目标 file.path-我使用了这种命令性方法,但是可以用保留正则文件夹和文件名的正则表达式替换它,并用空字符串替换所有其他部分(我想出了这样的正则表达式,但我失败了。

这个怎么运作

我的输入目录如下所示:
sources
├── foo
│   └── bar
│   └── lorem.txt
└── one
└── two
└── three
└── path
└── ipsum.log

我运行一个任务:
#: ./gradlew copyFiles                                                  
:copyFiles UP-TO-DATE

BUILD SUCCESSFUL
destDir看起来像这样:
destDir
├── bar
│   └── lorem.txt
└── path
└── ipsum.log

经过Gradle 2.14.13.5-rc-24.2.1测试

关于gradle - Gradle:如何将绝对路径列表复制到单个目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46597456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com