Merge pull request #381 from Sowevo/main

增加忽略SHA1跳过同名文件的功能
This commit is contained in:
xiaoyaofenfen 2024-01-30 14:51:36 +08:00 committed by GitHub
commit 8afdb8f701
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 43 additions and 19 deletions

View File

@ -239,6 +239,7 @@ aliyunpan d <网盘文件或目录的路径1> <文件或目录2> <文件或目
### 可选参数 ### 可选参数
``` ```
--ow overwrite, 覆盖已存在的文件 --ow overwrite, 覆盖已存在的文件
--skip skip same name, 跳过已存在的同名文件,即使文件内容不一致(不检查SHA1)
--status 输出所有线程的工作状态 --status 输出所有线程的工作状态
--save 将下载的文件直接保存到当前工作目录 --save 将下载的文件直接保存到当前工作目录
--saveto value 将下载的文件直接保存到指定的目录 --saveto value 将下载的文件直接保存到指定的目录

View File

@ -62,6 +62,7 @@ type (
NoRapidUpload bool NoRapidUpload bool
ShowProgress bool ShowProgress bool
IsOverwrite bool // 覆盖已存在的文件,如果同名文件已存在则移到回收站里 IsOverwrite bool // 覆盖已存在的文件,如果同名文件已存在则移到回收站里
IsSkipSameName bool // 跳过已存在的文件,即使文件内容不一致(不检查SHA1)
DriveId string DriveId string
ExcludeNames []string // 排除的文件名,包括文件夹和文件。即这些文件/文件夹不进行上传,支持正则表达式 ExcludeNames []string // 排除的文件名,包括文件夹和文件。即这些文件/文件夹不进行上传,支持正则表达式
BlockSize int64 // 分片大小 BlockSize int64 // 分片大小
@ -92,6 +93,10 @@ var UploadFlags = []cli.Flag{
Name: "ow", Name: "ow",
Usage: "overwrite, 覆盖已存在的同名文件,注意已存在的文件会被移到回收站", Usage: "overwrite, 覆盖已存在的同名文件,注意已存在的文件会被移到回收站",
}, },
cli.BoolFlag{
Name: "skip",
Usage: "skip same name, 跳过已存在的同名文件,即使文件内容不一致(不检查SHA1)",
},
cli.BoolFlag{ cli.BoolFlag{
Name: "norapid", Name: "norapid",
Usage: "不检测秒传。跳过费时的SHA1计算直接上传", Usage: "不检测秒传。跳过费时的SHA1计算直接上传",
@ -151,6 +156,9 @@ func CmdUpload() cli.Command {
9. 将本地的 C:\Users\Administrator\Video 整个目录上传到网盘 /视频 目录但是排除所有的 @eadir 文件夹 9. 将本地的 C:\Users\Administrator\Video 整个目录上传到网盘 /视频 目录但是排除所有的 @eadir 文件夹
aliyunpan upload -exn "^@eadir$" C:/Users/Administrator/Video /视频 aliyunpan upload -exn "^@eadir$" C:/Users/Administrator/Video /视频
10. 跳过已存在的同名文件即使文件内容不一致(不检查SHA1)
aliyunpan upload -skip 1.mp4 /视频
参考 参考
以下是典型的排除特定文件或者文件夹的例子注意参数值必须是正则表达式在正则表达式中^表示匹配开头$表示匹配结尾 以下是典型的排除特定文件或者文件夹的例子注意参数值必须是正则表达式在正则表达式中^表示匹配开头$表示匹配结尾
1)排除@eadir文件或者文件夹-exn "^@eadir$" 1)排除@eadir文件或者文件夹-exn "^@eadir$"
@ -186,16 +194,17 @@ func CmdUpload() cli.Command {
//} //}
RunUpload(subArgs[:c.NArg()-1], subArgs[c.NArg()-1], &UploadOptions{ RunUpload(subArgs[:c.NArg()-1], subArgs[c.NArg()-1], &UploadOptions{
AllParallel: c.Int("p"), // 多文件上传的时候,允许同时并行上传的文件数量 AllParallel: c.Int("p"), // 多文件上传的时候,允许同时并行上传的文件数量
Parallel: 1, // 一个文件同时多少个线程并发上传的数量。阿里云盘只支持单线程按顺序进行文件part数据上传所以只能是1 Parallel: 1, // 一个文件同时多少个线程并发上传的数量。阿里云盘只支持单线程按顺序进行文件part数据上传所以只能是1
MaxRetry: c.Int("retry"), MaxRetry: c.Int("retry"),
MaxTimeoutSec: timeout, MaxTimeoutSec: timeout,
NoRapidUpload: c.Bool("norapid"), NoRapidUpload: c.Bool("norapid"),
ShowProgress: !c.Bool("np"), ShowProgress: !c.Bool("np"),
IsOverwrite: c.Bool("ow"), IsOverwrite: c.Bool("ow"),
DriveId: parseDriveId(c), IsSkipSameName: c.Bool("skip"),
ExcludeNames: c.StringSlice("exn"), DriveId: parseDriveId(c),
BlockSize: int64(c.Int("bs") * 1024), ExcludeNames: c.StringSlice("exn"),
BlockSize: int64(c.Int("bs") * 1024),
}) })
// 释放文件锁 // 释放文件锁
@ -441,6 +450,7 @@ func RunUpload(localPaths []string, savePath string, opt *UploadOptions) {
UploadStatistic: statistic, UploadStatistic: statistic,
ShowProgress: opt.ShowProgress, ShowProgress: opt.ShowProgress,
IsOverwrite: opt.IsOverwrite, IsOverwrite: opt.IsOverwrite,
IsSkipSameName: opt.IsSkipSameName,
UseInternalUrl: opt.UseInternalUrl, UseInternalUrl: opt.UseInternalUrl,
GlobalSpeedsStat: globalSpeedsStat, GlobalSpeedsStat: globalSpeedsStat,
FileRecorder: fileRecorder, FileRecorder: fileRecorder,

View File

@ -64,8 +64,9 @@ type (
panFile string panFile string
state *uploader.InstanceState state *uploader.InstanceState
ShowProgress bool ShowProgress bool
IsOverwrite bool // 覆盖已存在的文件,如果同名文件已存在则移到回收站里 IsOverwrite bool // 覆盖已存在的文件,如果同名文件已存在则移到回收站里
IsSkipSameName bool // 跳过已存在的文件,即使文件内容不一致(不检查SHA1)
// 是否使用内置链接 // 是否使用内置链接
UseInternalUrl bool UseInternalUrl bool
@ -327,6 +328,7 @@ func (utu *UploadTaskUnit) Run() (result *taskframework.TaskUnitRunResult) {
var apierr *apierror.ApiError var apierr *apierror.ApiError
var rs *aliyunpan.MkdirResult var rs *aliyunpan.MkdirResult
var efi *aliyunpan.FileEntity
var appCreateUploadFileParam *aliyunpan.CreateFileUploadParam var appCreateUploadFileParam *aliyunpan.CreateFileUploadParam
var sha1Str string var sha1Str string
var contentHashName string var contentHashName string
@ -398,6 +400,23 @@ StepUploadPrepareUpload:
proofCode = "" proofCode = ""
contentHashName = "sha1" contentHashName = "sha1"
checkNameMode = "auto_rename" checkNameMode = "auto_rename"
// 如果启用了 覆盖/跳过 已存在的文件,则需要提前检查文件是否存在
if utu.IsOverwrite || utu.IsSkipSameName {
efi, apierr = utu.PanClient.FileInfoByPath(utu.DriveId, utu.SavePath)
if apierr != nil && apierr.Code != apierror.ApiCodeFileNotFoundCode {
result.Err = apierr
result.ResultMessage = "检测同名文件失败"
return
}
}
if utu.IsSkipSameName {
if efi != nil && efi.FileId != "" {
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
}
}
if !utu.NoRapidUpload { if !utu.NoRapidUpload {
// 计算文件SHA1 // 计算文件SHA1
fmt.Printf("[%s] %s 正在计算文件SHA1: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.LocalFileChecksum.Path.LogicPath) fmt.Printf("[%s] %s 正在计算文件SHA1: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.LocalFileChecksum.Path.LogicPath)
@ -421,12 +440,6 @@ StepUploadPrepareUpload:
if utu.IsOverwrite { 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 efi != nil && efi.FileId != "" {
if strings.ToUpper(efi.ContentHash) == strings.ToUpper(sha1Str) { if strings.ToUpper(efi.ContentHash) == strings.ToUpper(sha1Str) {
result.Succeed = true result.Succeed = true
@ -444,7 +457,7 @@ StepUploadPrepareUpload:
return return
} }
time.Sleep(time.Duration(500) * time.Millisecond) 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) fmt.Printf("[%s] %s 检测到同名文件,文件内容不一致,将旧文件移动到回收站: %s\n", utu.taskInfo.Id(), time.Now().Format("2006-01-02 15:04:06"), utu.SavePath)
} }
} }