scp适用于单次小文件传输且不自动创建远程目录,rsync适用于增量同步、断点续传及大量文件场景,二者路径处理逻辑不同:scp要求目标父目录存在,rsync末尾斜杠决定是否新建子目录。

scp 和 rsync 是 Linux 下最常用的两个远程文件拷贝工具,但它们适用场景完全不同——选错一个,轻则传不全、重则覆盖出错、断网重来。
scp -r 传目录前必须确保目标路径存在
scp 不会自动创建远程目标目录。如果你执行:
scp -r ./app/ user@192.168.1.100:/opt/deploy/app/
而远程 /opt/deploy/ 根本不存在,命令会直接报错:scp: /opt/deploy/app/: No such file or directory。
- 远程路径末尾加不加斜杠不影响创建行为,只影响目录层级(
app/vsapp) - 必须先手动建好父目录:
ssh user@192.168.1.100 "mkdir -p /opt/deploy"
- 如果目标是 root 权限路径(如
/usr/share/nginx/html),记得用sudo或切 root 用户,否则mkdir -p也会失败 -
-p参数可保留时间戳和权限,但不会帮你建目录;-C开启压缩,对小文件多的目录有明显提速
rsync -avz 的路径斜杠决定“复制整个目录”还是“复制目录内容”
这是最容易翻车的地方。这两条命令效果完全不一样:
rsync -avz ./project/ user@192.168.1.100:/var/www/→ 把
project/ 目录里的所有文件放进 /var/www/(即不新建 project 子目录)
rsync -avz ./project user@192.168.1.100:/var/www/→ 在
/var/www/ 下新建 project/ 目录,并把内容放进去
-
-a已包含递归、权限、时间戳、软链接等,日常够用;不需要再额外加-r -
-P同时启用进度显示 + 断点续传,大目录中途断网也不用重头来 - 若远程 SSH 端口不是 22,必须用
-e "ssh -p 2222"指定,rsync不认-P(那是 scp 的选项)
什么时候该用 scp,什么时候必须换 rsync
scp 适合:
- 单次、小批量传输(比如配置文件、日志片段)
- 目标机器资源紧张(
scp内存占用低,rsync需要扫描比对) - 你只需要“搬过去就行”,不关心是否已存在同名文件
rsync 必须上场:
- 目录大于 100MB 或含大量小文件(增量同步省时省带宽)
- 网络不稳定(
-P支持断点续传) - 需要排除某些子目录(用
--exclude='node_modules') - 要校验一致性(加
-c强制 checksum)
注意:rsync 默认不加密传输——它依赖 ssh 通道加密,所以只要你是用 user@host: 这种语法,就仍是安全的;但若直连 rsync daemon(host::module),就得自己配认证和防火墙。
真正麻烦的从来不是命令敲不对,而是没意识到:scp 把路径当“终点”,rsync 把路径当“上下文”。
一个少敲了 mkdir -p,一个少了一个斜杠,结果就是文件进了错地方、或者根本没进去。


















