我正在编写一个将tarball提取到目录中的任务。我不控制这个tarball的内容。
tarball包含一个目录,其中包含我实际关注的所有文件。我想从该目录中取出所有内容并将其复制到我的目的地。
示例:
/root/subdir
/root/subdir/file1
/root/file2
所需:
/subdir
/subdir/file1
/file2
这是我到目前为止所尝试的内容,但这似乎是一种非常愚蠢的方式:
copy {
eachFile {
def segments = it.getRelativePath().getSegments() as List
it.setPath(segments.tail().join("/"))
return it
}
from tarTree(resources.gzip('mytarfile.tar.gz'))
into destinationDir
}
对于每个文件,我获取其路径的元素,删除第一个,使用/
连接,然后将其设置为文件的路径。这有点......问题是这会产生以下结构:
/root/subdir
/root/subdir/file1
/root/file2
/subdir
/subdir/file1
/file2
我很好,只是删除根目录作为任务的最终操作,但我觉得应该有一个更简单的方法来做到这一点。
答案 0 :(得分:2)
AFAIK,唯一的办法是解压缩zip,tar,tgz文件:(
有一个未解决的问题here 请投票吧!
在那之前,解决方案并不是很漂亮,但也不是那么难。在下面的示例中,我假设您要删除' apache-tomcat-XYZ'来自' tomcat'的根级目录配置只包含apache-tomcat zip文件。
def unpackDir = "$buildDir/tmp/apache.tomcat.unpack"
task unpack(type: Copy) {
from configurations.tomcat.collect {
zipTree(it).matching {
// these would be global items I might want to exclude
exclude '**/EMPTY.txt'
exclude '**/examples/**', '**/work/**'
}
}
into unpackDir
}
def mainFiles = copySpec {
from {
// use of a closure here defers evaluation until execution time
// It might not be clear, but this next line "moves down"
// one directory and makes everything work
"${unpackDir}/apache-tomcat-7.0.59"
}
// these excludes are only made up for an example
// you would only use/need these here if you were going to have
// multiple such copySpec's. Otherwise, define everything in the
// global unpack above.
exclude '**/webapps/**'
exclude '**/lib/**'
}
task createBetterPackage(type: Zip) {
baseName 'apache-tomcat'
with mainFiles
}
createBetterPackage.dependsOn(unpack)
答案 1 :(得分:0)
使用groovy的语法,我们可以使用正则表达式消除第一个路径段:
renderPrint