aliyun/ossutil

sync命令配合--delete同步到本地时,目标地址无法使用绝对路径

Closed this issue · 1 comments

问题描述:
sync命令搭配--delete --backup-dir参数,从OSS同步数据到本地,当指定了完整路径时,会报错。
错误信息形式:

Error: rename C:\ossutil64\C:\ossutil64\test\helloworld.txt ossbackup/test\helloworld.txt: The filename, directory name, or volume label syntax is incorrect.

复现方式,执行如下命令:
ossutil sync -u --delete --backup-dir=backup oss://test-bucket/srcFolder D:\destFolder

第一次成功同步。当删除bucket中数据之后,会触发备份的逻辑,尝试将文件移动至备份目录下。
在拼接文件源地址的时候,调用了GetAbsPath函数,计算方式是 工作目录 + 目标目录,这导致了只能操作相对路径。

ossutil/lib/sync.go

Lines 773 to 793 in 5a1b188

func (sc *SyncCommand) GetAbsPath(strPath string) (string, error) {
currentDir, err := os.Getwd()
if err != nil {
return "", err
}
if !strings.HasSuffix(strPath, string(os.PathSeparator)) {
strPath += string(os.PathSeparator)
}
strPath = currentDir + string(os.PathSeparator) + strPath
absPath, err := filepath.Abs(strPath)
if err != nil {
return "", err
}
if !strings.HasSuffix(absPath, string(os.PathSeparator)) {
absPath += string(os.PathSeparator)
}
return absPath, err
}

absDirName, err := sc.GetAbsPath(sUrl.ToString())

sc.movePath(absDirName+dirName, sc.syncOption.backupDir+dirName)

修复建议:
GetAbsPath函数中,判断目标地址是否为相对路径,还是绝对路径(比如/开头,或者驱动器C:\开头)。

Go用得不熟,只能读代码还没法提PR,希望能尽快修复这个bug

kkuai commented

thank you very much,I will fix it on version v1.7.6