aliyunpan
aliyunpan copied to clipboard
优化一下
因为要上传几万个小文件,而且经常要重复上传同个文件夹,很多已经上传过的。能否增加检测到同名文件就直接跳过,不用计算sha1。如果加了 --norapid,我发现会上传,然后上传后才识别到同名文件,这样浪费大量时间。-p也希望能调大(目前最大20),比如500。
(1)你这种场景就不要加这个 --norapid 这个标志,小文件sha1计算很快的,你应该增加 --ow 这个标志检测同名文件,同名的文件就跳过不再重复上传 (2)-p会在下个版本放开,不再限制,但是这个数量调太大会出问题,阿里那边会有风控
(1)你这种场景就不要加这个 --norapid 这个标志,小文件sha1计算很快的,你应该增加 --ow 这个标志检测同名文件,同名的文件就跳过不再重复上传 (2)-p会在下个版本放开,不再限制,但是这个数量调太大会出问题,阿里那边会有风控
我测试过了,大多数是1M以内的文件,而且特别特别多,反正加不加 --norapid ,都很慢,因为文件数太多了。我用rclone就很快,可以跳过同文件名,只不过只对国外网盘友好。 我加了 --ow ,去掉--norapid ,一样会上传,反正我看到有上传速度,而且确实也很慢,是上传完后才识别是重复文件,然后进回收站,非常浪费时间
这意味你这个文件有被修改过啦,肯定需要重新上传最新的,不然的话你云盘上的文件内容和本地的文件就不一致了
这意味你这个文件有被修改过啦,肯定需要重新上传最新的,不然的话你云盘上的文件内容和本地的文件就不一致了
我这说错了,是加了--norapid --ow,一样会上传。因为这个程序的逻辑是先上传再检测同名文件,如果同名就删掉进回收站,所以没有我想要的那种跳过同名文件的效果。 如果是没有加--norapid ,确实不会上传,但会检测sha1,一样会浪费时间,因为文件数太多
这意味你这个文件有被修改过啦,肯定需要重新上传最新的,不然的话你云盘上的文件内容和本地的文件就不一致了
我这说错了,是加了--norapid --ow,一样会上传。因为这个程序的逻辑是先上传再检测同名文件,如果同名就删掉进回收站,所以没有我想要的那种跳过同名文件的效果。
你不要加norapid,只加ow 上传这部分的逻辑是先检测网盘有没有一样的文件,如果有一模一样的文件就直接跳过,如果只是文件名相同,但是内容不同会删除云盘的文件重新上传。
这意味你这个文件有被修改过啦,肯定需要重新上传最新的,不然的话你云盘上的文件内容和本地的文件就不一致了
我这说错了,是加了--norapid --ow,一样会上传。因为这个程序的逻辑是先上传再检测同名文件,如果同名就删掉进回收站,所以没有我想要的那种跳过同名文件的效果。
你不要加norapid,只加ow 上传这部分的逻辑是先检测网盘有没有一样的文件,如果有一模一样的文件就直接跳过,如果只是文件名相同,但是内容不同会删除云盘的文件重新上传。
是的,只加ow,但检测sha1其实一样很浪费时间,文件数太多太多了,要6、7个小时。谷歌网盘,我用rclone半小时就搞定了(rclone可以设置跳过同文件名,且不检测sha1)。
这意味你这个文件有被修改过啦,肯定需要重新上传最新的,不然的话你云盘上的文件内容和本地的文件就不一致了
我这说错了,是加了--norapid --ow,一样会上传。因为这个程序的逻辑是先上传再检测同名文件,如果同名就删掉进回收站,所以没有我想要的那种跳过同名文件的效果。
你不要加norapid,只加ow 上传这部分的逻辑是先检测网盘有没有一样的文件,如果有一模一样的文件就直接跳过,如果只是文件名相同,但是内容不同会删除云盘的文件重新上传。
而且我注意到 一个几百KB小文件要20秒? 检测到同名文件,文件内容完全一致,无需重复上传: /img/new/2023/10/08/05/35/808575-768x1197.jpg [1191] 2023-10-08 22:03:23 文件上传结果: 成功! 耗时 20秒
这确实,检测同名文件确实会慢的,你要不试试同步备份功能吧,应该会快一点,下面这个命令
aliyunpan sync start -ldir "D:\本地目录\xxxxxxx" -pdir "/云盘目录/xxxxx" -mode "upload"
这确实,检测同名文件确实会慢的,你要不试试同步备份功能吧,应该会快一点,下面这个命令
aliyunpan sync start -ldir "D:\本地目录\xxxxxxx" -pdir "/云盘目录/xxxxx" -mode "upload"
这个很早就试了,同步了几小时,网盘漏了一大堆文件,而且看不到输出。 目前我自己写了shell脚本 就上传过去两天的文件 暂时就这样
如果是文件内容与结构不发生变化,但是会新增文件的场景,可能需要用到这个功能
我的想法是再加一个选项,对目前--ow
的功能进行扩展
举个例子 --skip
当启用--skip
时,同名文件存在的话,直接跳过
可能要改下upload_task_unit.go
这块代码
https://github.com/tickstep/aliyunpan/blob/6a7da9f1809f045aa5ab3d8e8b68f066c1ea5948/internal/functions/panupload/upload_task_unit.go#L401-L449
这里是一个可能的例子? 如果有空了,我试着完善下这个功能
sha1Str := ""
proofCode := ""
contentHashName := "sha1"
checkNameMode := "auto_rename"
// 在这里先判断同名文件是否存在
if utu.IsOverwrite {
efi, apierr := utu.PanClient.FileInfoByPath(utu.DriveId, utu.SavePath)
if apierr != nil && apierr.Code != apierror.ApiCodeFileNotFoundCode {
result.Err = apierr
result.ResultMessage = "检测同名文件失败"
return
}
if efi != nil && efi.FileId != "" && utu.SkipCheck {
result.Succeed = true
result.Extra = efi
fmt.Printf("[%s] %s 检测到同名文件,跳过SHA1校验,无需重复上传: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.SavePath)
return
}
}
if !utu.NoRapidUpload {
fmt.Printf("[%s] %s 正在计算文件SHA1: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.LocalFileChecksum.Path.LogicPath)
utu.LocalFileChecksum.Sum(localfile.CHECKSUM_SHA1)
sha1Str = utu.LocalFileChecksum.SHA1
if utu.LocalFileChecksum.Length == 0 {
sha1Str = aliyunpan.DefaultZeroSizeFileContentHash
}
// proof code
localFile, _ := os.Open(utu.LocalFileChecksum.Path.RealPath)
localFileInfo, _ := localFile.Stat()
proofCode = aliyunpan.CalcProofCode(utu.PanClient.GetAccessToken(), rio.NewFileReaderAtLen64(localFile), localFileInfo.Size())
localFile.Close()
} else {
fmt.Printf("[%s] %s 已经禁用秒传检测,直接上传\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"))
contentHashName = "none"
checkNameMode = "auto_rename"
}
// 正常覆盖旧文件的代码
if utu.IsOverwrite {
efi, apierr := utu.PanClient.FileInfoByPath(utu.DriveId, utu.SavePath)
if apierr != nil && apierr.Code != apierror.ApiCodeFileNotFoundCode {
result.Err = apierr
result.ResultMessage = "检测同名文件失败"
return
}
if efi != nil && efi.FileId != "" {
if strings.ToUpper(efi.ContentHash) == strings.ToUpper(sha1Str) {
result.Succeed = true
result.Extra = efi
fmt.Printf("[%s] %s 检测到同名文件,文件内容完全一致,无需重复上传: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.SavePath)
return
}
// existed, delete it
var fileDeleteResult []*aliyunpan.FileBatchActionResult
var err *apierror.ApiError
fileDeleteResult, err = utu.PanClient.FileDelete([]*aliyunpan.FileBatchActionParam{{DriveId: efi.DriveId, FileId: efi.FileId}})
if err != nil || len(fileDeleteResult) == 0 {
result.Err = err
result.ResultMessage = "无法删除文件,请稍后重试"
return
}
time.Sleep(time.Duration(500) * time.Millisecond)
fmt.Printf("[%s] %s 检测到同名文件,已移动到回收站: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.SavePath)
}
}