在 Linux 系统中,跨服务器拷贝文件或目录
1. scp(Secure Copy,基于 SSH)
特点:加密传输,简单易用,适合小文件或少量文件。
1.1.基本语法:

1.1.1拷贝本地文件到远程服务器:
scp /path/local_file username@remote_ip:/path/remote_directory
1.1.2.从远程服务器拷贝文件到本地:
scp username@remote_ip:/full/remote_path /full/local_path
1.1.3.拷贝目录(递归):
scp -r /path/local_dir username@remote_ip:/path/remote_directory
scp -r ./testlib ting@hsr:/home/ting
此时远程服务器中不用mkdir lib 就可以接收到目录testlib。
1.1.4.指定端口(若 SSH 端口非默认 22):
scp -P 2222 /path/file username@remote_ip:/path/
1.1.5选项:
-r:递归拷贝目录。-P:指定 SSH 端口(注意是大写的P)。-C:启用压缩传输。-v:显示详细过程(调试用)。- 跨领域拷贝文件 SCP -r 不识别 “ * ”
2. rsync(高效同步工具)
特点:增量同步,支持断点续传,适合大文件或定期备份。
2.1.基本语法:

2.1.1.同步本地目录到远程服务器:
rsync -avz /path/local_dir/ username@remote_ip:/path/remote_directory/
rsync -avz ./testt/ ting@hcsr:~/projects/
仅同步了 testt目录下的文件,而目录testt 并不会被同步过去
rsync -avz ./test2 ting@hcsr:~/projects/
如果库test2后面不加/ 后 同步到远程 test2 目录以及文件下内容都会同步过去。
关键点:
- 如果源路径是目录,结尾加
/(如/test2/)表示同步目录内的内容,不加/会同步目录本身。 - 远程路径必须包含
:(如user@remote:/path)。
2.1.2.从远程服务器同步到本地:
rsync -avz username@remote_ip:/path/remote_dir/ /path/local_directory/
rsync -avz ting@hsr:/home/ting/test3 ./
将远程服务器中的test3目录同步到当前 ./
因为test3后 没有加/ 所以同步过来的是目录 而不是目录下的文件。
2.1.3.排除特定文件:
rsync -avz --exclude='*.tmp' /path/local_dir/ username@remote_ip:/path/remote_dir/
2.1.4.通过 SSH 指定端口:
rsync -avz -e 'ssh -p 2222' /path/local_dir/ username@remote_ip:/path/remote_dir/
2.1.5.选项:
- -a:归档模式(保留权限、时间戳等元数据)
- -v:显示详细传输过程
- -z:启用压缩传输
- --delete:严格同步(删除目标端多余文件)
- --progress:实时显示传输进度
3. sftp(交互式文件传输)
特点:类似 FTP,但基于 SSH 加密,适合交互式操作。
3.1.基本用法:

连接后可执行以下命令:
put local_file:上传本地文件到服务器get remote_file:从服务器下载文件mkdir、rm等操作与本地命令用法相同
常用操作与本地终端基本一致。
4. nc(netcat) + tar(无加密快速传输)
适用场景:内网高速传输,无需加密时(如大量数据)。
4.1.示例:
- 接收端(先启动监听):
nc -l 1234 | tar -xvf - - 发送端:
tar -cvf - /path/to/dir | nc remote_ip 12344.1.1注意事项:
- 权限问题:确保目标路径有写入权限。
- 防火墙:开放对应端口(如 SSH 的 22 端口)。
- 大文件传输:建议用
rsync或screen/tmux防止中断。 - 密码替代方案:配置 SSH 免密登录(使用公钥认证)。
5.如何选择?
- 简单拷贝小文件 →
scp。 - 定期同步/大文件 →
rsync。 - 交互式操作 →
sftp。 - 内网高速传输 →
nc + tar。
6.在 Linux 中,跨服务器传输目录后,可以通过以下方法对比源目录和目标目录的大小是否一致,确保数据完整性:
方法 1:使用 du 命令(统计目录大小)
步骤:
-
在源服务器计算目录大小:
du -sh /path/to/source_directory输出示例:
2.5G /path/to/source_directory-s:仅显示总大小。-h:以人类可读格式(GB/MB/KB)。
-
在目标服务器执行相同命令:
du -sh /path/to/destination_directory -
对比两边的输出值是否一致。
方法 2:使用 rsync 的 --dry-run 模式
如果传输工具是 rsync,可以直接模拟同步并检查差异:
rsync -avn --delete /path/source/ username@remote_ip:/path/destination/
这个命令执行以下操作:
-a:归档模式,保持文件属性和递归同步-v:详细输出模式-n(--dry-run):仅模拟操作,不实际传输。--delete:删除目标目录中源目录不存在的文件- 最后两个参数分别指定源目录和目标目录
- 如果输出显示 无文件需同步,则说明两端一致。
方法 3:使用 diff 对比文件列表
步骤:
-
在源服务器生成文件列表(含大小和路径):
To generate a sorted list of file sizes and paths, use this command:
find /path/source -type f -printf "%s %p " | sort > source_list.txtThis will create a
source_list.txtfile containing all files in/path/source, sorted by size. -
在目标服务器生成相同格式的列表:
find /path/destination -type f -printf "%s %p
" | sort > dest_list.txt
3.将 dest_list.txt 传回源服务器,用 diff 对比:
diff source_list.txt dest_list.txt
- 如果输出为空,说明文件完全一致。
- 如果显示差异,则需检查具体文件。
7.常见问题排查
7.1大小一致但文件数不同:
- 检查隐藏文件(如
.file)是否被忽略:ls -la /path/dir。 - 使用
tree命令对比目录结构:
将源目录结构导出到文件:
tree /path/source > source_tree.txt
将目标目录结构导出到文件:
tree /path/destination > dest_tree.txt
比较两个目录结构的差异:
diff source_tree.txt dest_tree.txt
7.2.权限/所有者不一致:
rsync默认保留权限(需-a选项),scp不保留。- 检查权限:
ls -l /path/file。
8.问题
rsync error: syntax or usage error (code 1) at main.c(1348) [sender=3.1.2]
这个错误表明 rsync 命令的语法或用法存在问题。
8.1. 检查命令语法
错误示例:
rsync -avz ./source user@remote: /dest
# 服务器与目录之间有空格
正确写法:
rsync -avz ./source user@remote:/dest/
#服务器与目录之间无空格
本文地址:https://www.yitenyun.com/421.html









