diff --git a/.gitignore b/.gitignore index 173454b..f9dda37 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ *.iml out gen +*_test.go \ No newline at end of file diff --git a/rsync.go b/rsync.go index 825f00c..8e2ebef 100644 --- a/rsync.go +++ b/rsync.go @@ -21,17 +21,17 @@ type Rsync struct { type RsyncOptions struct { // Verbose increase verbosity Verbose bool - // Quet suppress non-error messages + // Quiet suppress non-error messages Quiet bool // Checksum skip based on checksum, not mod-time & size Checksum bool - // Archve is archive mode; equals -rlptgoD (no -H,-A,-X) + // Archive is archive mode; equals -rlptgoD (no -H,-A,-X) Archive bool // Recurse into directories Recursive bool // Relative option to use relative path names Relative bool - // NoImliedDirs don't send implied dirs with --relative + // NoImpliedDirs don't send implied dirs with --relative NoImpliedDirs bool // Update skip files that are newer on the receiver Update bool @@ -196,7 +196,8 @@ func (r Rsync) StderrPipe() (io.ReadCloser, error) { // Run start rsync task func (r Rsync) Run() error { - if !isExist(r.Destination) { + // 目标地址为 远程地址 则不进行文件夹创建 + if !isRsyncPath(r.Destination) && !isExist(r.Destination) { if err := createDir(r.Destination); err != nil { return err } @@ -552,3 +553,15 @@ func isExist(p string) bool { stat, err := os.Stat(p) return os.IsExist(err) && stat.IsDir() } + +// isRsyncPath 判断一个给定的字符串或路径是否格式是否符合rsync协议的要求 +func isRsyncPath(path string) bool { + if strings.HasPrefix(path, "rsync://") { + return true + } + parts := strings.SplitN(path, ":", 2) + if len(parts) == 2 && strings.Contains(parts[0], "@") { + return true + } + return false +}