如何使用Jenkins fileOperations插件按特定模式重命名文件及解决失败问题
解决Jenkins fileOperations插件重命名带版本号文件的问题
兄弟,这个坑我之前刚踩过!你遇到的FATAL: The source file/var/jenkins_home/workspace/*.txt doesn't exist报错,根源在于fileOperations插件的fileRenameOperation根本不支持直接用*.txt这种通配符当源路径——它会把*.txt当成一个真实的文件名去查找,而不是匹配所有txt文件,这不就找不到了嘛。
针对你要把MyFile<VersionNumber>.txt(比如MyFile_v12.1.4.txt)重命名为固定MyFile.txt的需求,给你两个实用的解决方案:
方案1:结合Jenkins Pipeline的findFiles函数+fileOperations插件
先通过findFiles精准匹配到符合规则的文件,再逐个调用重命名操作,完美适配插件的要求:
pipeline { agent any stages { stage('Rename Versioned Files') { steps { script { // 匹配所有以MyFile开头、以.txt结尾的文件,兼容各种版本号格式 def targetFiles = findFiles(glob: 'MyFile*.txt') if (targetFiles.size() > 0) { // 遍历找到的文件,逐个重命名为MyFile.txt targetFiles.each { file -> // 跳过已经是目标名称的文件,避免重复操作报错 if (file.name != 'MyFile.txt') { fileOperations([ fileRenameOperation( source: file.name, destination: 'MyFile.txt' ) ]) echo "✅ 已将 ${file.name} 重命名为 MyFile.txt" } } } else { echo "ℹ️ 未找到符合MyFile<VersionNumber>.txt格式的文件" } } } } } }
如果你的版本号格式有严格要求(比如必须是MyFile_vx.x.x.txt这种带下划线和点的格式),可以把匹配规则改成更精准的正则:
// 只匹配MyFile_v+数字点数字点数字.txt格式的文件 def targetFiles = findFiles().findAll { it.name ==~ /MyFile_v\d+\.\d+\.\d+\.txt/ }
方案2:直接用Shell命令(简单粗暴高效)
要是你不需要死磕fileOperations插件,用Shell命令会更直接,尤其在Linux/macOS的Jenkins代理上:
pipeline { agent any stages { stage('Rename Files via Shell') { steps { sh ''' # 遍历所有符合MyFile*.txt模式的文件 for file in MyFile*.txt; do # 跳过已经是目标名称的文件 if [ "$file" != "MyFile.txt" ]; then mv "$file" MyFile.txt echo "Renamed $file to MyFile.txt" fi done ''' } } } }
这个方法会自动处理重复文件的情况,避免不必要的报错。
重要提醒
- 如果工作空间里同时存在多个符合模式的文件(比如
MyFile_v12.1.4.txt和MyFile_v13.0.0.txt),重命名会直接覆盖MyFile.txt,记得提前处理这种冲突场景(比如先备份或者只保留最新版本的文件)。 - 确保Jenkins代理用户有足够的权限修改工作空间内的文件,不然会出现权限报错。
内容的提问来源于stack exchange,提问作者Chriss
相关产品推荐
相关产品推荐

