rsync 支持断点续传,需同时使用 --partial 和 --partial-dir(如 .rsync-partial/),并注意源文件未修改、权限及路径配置;仅 --partial-dir 无效。

scp 中断后不能直接续传,必须换 rsync
scp 本身不支持断点续传,传输中断就只能重来。rsync 的 --partial 和 --partial-dir 才是真正解决这个问题的组合。但注意:--partial-dir 不是“自动续传开关”,它只是把未完成的临时文件存到指定目录,避免污染目标路径——真正起续传作用的是 --partial + --append(大文件)或默认的增量比对逻辑。
rsync --partial-dir 的正确用法和必要参数
只加 --partial-dir 不够,常见错误是漏掉 --partial 或忽略权限/时间戳干扰。实际命令要这样组织:
rsync -av --partial --partial-dir=.rsync-partial/ \ --rsh="ssh -p 2222" \ /local/file.zip user@host:/remote/path/
-
--partial:保留传输中断时的不完整文件(否则 rsync 默认删掉) -
--partial-dir=.rsync-partial/:把所有未完成的临时文件放进这个子目录,不影响目标目录的干净性 -
-a保持属性,但若源文件被修改过,可能触发全量重传;如只关心内容一致,可改用-r --checksum -
--rsh显式指定 ssh 参数(比如非标端口),否则容易因连接配置缺失导致失败
中断后重试时 rsync 怎么识别并续传
rsync 不会“扫描 .rsync-partial/ 然后接上”,它的续传逻辑依赖两点:源文件没变 + 目标端已有同名不完整文件。所以:
- 如果目标路径下已存在
file.zip(完整),rsync 会跳过 —— 它不校验是否真和源一致,只看大小和修改时间 - 如果中断后目标端只有
.rsync-partial/file.zip.12345(临时名),rsync 会把它重命名为file.zip并继续写入(前提是加了--partial) - 若源文件在中断后被修改过,rsync 会当作新文件处理,丢弃旧临时文件,从头传 —— 这是设计使然,不是 bug
- 对超大单文件,可加
--append强制追加模式(要求文件末尾没变化),比默认行为更可靠
容易被忽略的权限与路径陷阱
--partial-dir 路径是相对于目标目录的,且 rsync 必须有写入该目录的权限。常见翻车点:
- 目标路径是
/var/www/,--partial-dir=.rsync-partial实际创建在/var/www/.rsync-partial/,如果 ssh 用户对/var/www/只有写文件权限、没有建目录权限,就会报错mkdir failed: Permission denied (13) - 使用绝对路径如
--partial-dir=/tmp/rsync-partial可绕过,但需确保远程用户对那个路径有读写权,且注意磁盘空间归属 - 如果目标是 root 目录,又没用
sudo或对应权限,--partial-dir创建失败会导致整个传输终止,不会退化为无目录模式 - 某些老版本 rsync(--partial-dir,执行时报错
unrecognized option,得先查rsync --version
真正麻烦的不是语法,而是中断后你得确认源文件没动、目标端临时文件还在、权限够写、rsync 版本支持——四个条件缺一不可。










