mirror of
https://github.com/tickstep/aliyunpan.git
synced 2025-01-23 22:42:15 +08:00
commit
8afdb8f701
@ -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 将下载的文件直接保存到指定的目录
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user