scp -r 是最直接、最常用的方式,但不是唯一方式,也容易出错;路径末尾斜杠决定复制目录本身(mydir)还是其内容(mydir/),漏加斜杠会导致远程出现嵌套目录,rsync -avz 更适合大目录或需断点续传。

scp -r 是最直接、最常用的方式,但不是唯一方式,也容易出错。
用 scp -r 传整个文件夹,路径末尾的斜杠很关键
scp -r 默认把源目录「本身」复制过去,而不是复制它的内容。这导致很多人传完发现远程多了一层同名目录。
比如执行:
scp -r mydir user@host:/home/user/target结果是
/home/user/target/mydir/...,而不是 /home/user/target/...。
想让 mydir 里的内容直接落到 target 目录下,得加斜杠:
scp -r mydir/ user@host:/home/user/target注意是
mydir/(带斜杠),不是 mydir(不带)。这个斜杠告诉 scp 把目录内容展开复制。
常见错误现象:
- 远程出现嵌套目录(如
target/mydir/mydir/...)→ 源路径漏了斜杠或目标路径写错了 - 提示
scp: /path/to/target: No such file or directory→ 远程目标父目录不存在,scp不会自动创建 - 权限拒绝但 SSH 能连 → 远程用户对目标目录无写权限,或 SELinux/AppArmor 限制
rsync 更适合大目录或需断点续传
rsync 在传输大文件夹时优势明显:支持增量同步、压缩传输、进度显示、失败后可重试。
基本用法:
rsync -avz --progress mydir/ user@host:/home/user/target
关键参数说明:
-
-a:归档模式,保留权限、时间戳、软链接等 -
-v:详细输出,能看到哪些文件被跳过或传输 -
-z:传输中压缩数据(对文本类有效,二进制文件可能无效) -
--progress:实时显示传输进度和速度
注意:
- 源路径末尾也要加
/(mydir/),否则会把mydir整体建在target下 - 首次传输和
scp -r性能接近;后续再运行,只传变化部分 - 如果远程没有
rsync,会报错bash: rsync: command not found,需先在远程安装(sudo apt install rsync或yum install rsync)
传不了?先确认三件事
很多问题其实卡在基础环节:
-
ssh user@host能成功登录吗?不能就别谈传输 —— 先解决认证(密码、密钥、防火墙) - 远程目标路径的父目录存在吗?
scp和rsync都不会自动创建上级目录,比如要传到/var/www/app,得确保/var/www已存在 - 远程用户对目标目录有写权限吗?
ls -ld /path/to/target看权限,必要时用chmod或chown调整
Windows 用户别用 PowerShell 直接敲 scp 命令
Windows 10/11 自带 OpenSSH 客户端,但默认没启用。直接运行 scp 报“命令未找到”,不是你写错了,而是功能没开。
启用方法(管理员权限运行 PowerShell):
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
或者更稳妥的方式:用 WSL2(Ubuntu)跑 scp 或 rsync,避免 Windows 路径分隔符(\ vs /)、空格、编码等问题。
特别提醒:
- Windows 路径如
C:\data\folder,在scp中要写成/c/data/folder(WSL)或用双引号包裹"C:\data\folder"(PowerShell) - 含空格的路径必须加引号,否则 shell 会截断:
scp -r "my folder/" user@host:/tmp
真正麻烦的从来不是命令本身,而是路径是否真实存在、权限是否到位、网络是否稳定。传之前多敲一次 ssh user@host ls -l /target/path,比传一半失败再重来省十分钟。


















