rsync:linux间的高效传输工具
以前我向服务器传输文件用的是 scp,后来因为传输的文件量大了后,每次全量传输时间都很长,不能忍
于是我换成了 FTP 的软件,它会比对本地和服务器的文件差异,只传输有变化的文件,速度快了不少,但是每次都需要打开软件去点点点, 不 cool
直到我了解了 rsync
# 一、rsync 是什么
rsync (remote sync) 是一个常用的 Linux 应用程序,用于文件同步。
与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
rsync 的特点就是仅传输有变动的部分, 解决了 scp 传输的痛点
# 二、rsync 加入我的工作流
我的博客基于 vuepress 开发,本地编译后把编译生成的文件传输到服务器,由 nginx 代理
我在项目的 pakage.json 中加入了 production 脚本
执行步骤如图所示 vuepress build docs 打包完成之后 执行 sh build/upload.sh 脚本
upload.sh 脚本就一行
#!/bin/bash
rsync -vrh --exclude={'vue-web/*','.git/*'} /Users/xinyun/study/gcy-blog/webView root@0.0.0.0:/usr/share/nginx/html
2
3
4
5
6
简单说下上面的参数:
/Users/xinyun/study/gcy-blog/webView 为源文件夹
root@0.0.0.0:/usr/share/nginx/html 为目标文件夹
以源文件夹为基准更新目标文件夹的文件
如果只想同步源目录 source 里面的内容到目标目录 destination,则需要在源目录后面加上斜杠。
-r 表示递归,即包含子目录。注意,-r 是必须的,否则 rsync 运行不会成功。
-v 显示传输过程的详细信息
-h 以人性化风格显示详情
--exclude 需要排除的目录,支持正则匹配,多个目录以 , 分隔
运行结果
可以看到传输信息
sent 1.14M bytes received 45.81K bytes 787.89K bytes/sec
total size is 5.61M speedup is 4.75
2
3
实际我的整个目录是大约 50m,实际传输只有 1.14MB
利用 rsync 后我的博客更新只需要终端执行
npm run production
2
3
nice
# 删除目标文件夹的非目标文件
使用 --delete
指令
rsync 可以使用--delete 选项来删除目标文件夹中不存在于源文件夹中的文件。
如果你想要删除目标文件夹中不存在于源文件夹中的文件,但不想删除非目标文件,可以使用--exclude 选项排除这些文件。例如,假设你的源文件夹是/source,目标文件夹是/destination,你想同步这两个文件夹,但不想删除/destination 中的非目标文件,可以使用以下命令:
rsync -av --delete --exclude 'non-target-file.txt' /source/ /destination/
2
这个命令将同步/source 和/destination 中的所有文件和文件夹,但排除名为 non-target-file.txt 的文件。这样,非目标文件就不会被删除。
# 三、需要注意
传输的双方都必须安装 rsync。
我用 Mac 开发,服务器是 centos 系统,所以都自带 rsync 👏👏👏
有关 rsync 更多细节可以查看阮一峰老师的rsync 用法教程 (opens new window)