Groovy获取具有特定结尾的文件名,仅知道路径



我在我的 Jenkinsfiles 中使用了 groovy。gradle-build创建一个看起来像这样的罐子:appName-1.0.0-ua67435.jar并复制到/opt/appName

在 Jenkinsfile (Groovy( 中,我现在喜欢将字符串的这一部分1.0.0-ua67435在变量中。我希望这个正则表达式应该完成这项工作:-(.*?).jar$

我知道我的文件在哪里,但我不知道它的名字。它是/opt/appName/文件夹中唯一的.jar

当我只知道文件名的位置和名称模式时,如何获取其子字符串?

试试这个:

new File("/opt/appName/").eachFileMatch(FileType.FILES, ~/^.*-.*?.jar$/, { println it.name })

它使用每个文件匹配将名称与特定模式匹配,您可以从文档链接中看到更多示例。


如果不允许导入,则像这样使用完整的限定名。

...eachFileMatch(groovy.io.FileType.FILES,...

您可以使用

def names = []
new File("/opt/appName/").eachFileMatch groovy.io.FileType.FILES, ~/(?<=appName-).*(?=[.]jar$)/, { names << it.name }

(?<=appName-).*(?=[.]jar$)正则表达式将只获取字符串末尾的appName-.jar之间的变量部分。如果在appName之前添加^,则仅当它位于文件名的开头时才会匹配。

请参阅正则表达式演示。

  • (?<=appName-)- 确保当前位置左侧有appName
  • .*- 除换行符字符以外的任何 0+ 字符尽可能多
  • (?=[.]jar$)- 确保在当前位置的右侧有一个子字符串,后跟.jar字符串位置的末尾。

有关eachFileMatch的更多详细信息,请点击此处。

您可以FileNameFinder类轻松找到它:

println new FileNameFinder().getFileNames(folderPath, '**/appName*.jar').collect{ it.substring(it.lastIndexOf('/')+1, it.size())}

最新更新