- /
- Skills/
- 建站/
- 使用 rsync 实现文件同步/
使用 rsync 实现文件同步
目录
本文介绍本地文件向远程文件上传文件、并可以保持同步的简单方法,这些工具都是 linux 服务器支持的。
这在需要服务器间传递、同步数据,或者在本地向远程服务器上传同步网站页面代码时,非常简单高效。
scp 全目录上传 #
scp
是基于 ssh
的文件传输工具,使用下面的命令可以将本地目录的数据文件上传到服务器。
每次上次都是整个本地目录上传,不支持增量同步(即第一次上传后,不支持后面每次只上传修改的文件)。
例子 #
> scp -rp 本地目录 -P 端口 用户@远程主机:/远程目录
# 如果配置了 `ssh` 免密登录的,可使用下面的简化命令
> scp -rp 本地目录 ssh配置名:/远程目录
如何配置 ssh 别名,可看本站文章
说明:
本地目录
与远程目录
之后有没/
这个斜杠,效果是有差别的。- 如果是
本地目录
,表示上传本地目录中的所有文件,结果为远程目录/本地目录
- 如果是
本地目录/
、远程目录/
,表示上传到远程服务器,本地目录
对应远程目录
,不会产生远程目录/本地目录
这个结果。
- 如果是
- 参数
-r
表示 上传本地目录文件是,文件夹与其下的目录都上传 - 参数
-p
表示 上传到服务器的文件保留与本地一样的文件修改时间
,访问时间
和访问权限
若上传的数据目录中带有软链接,不要使用
scp
同步,因为会丢失。采用其它工具或者先将文件夹打包后上传,在远程服务器上解包。
rsync 可增量同步(增量更新) #
rsync
与 scp
类似,所有命令格式非常接近。不同的是,rsync
支持增量上传,这对『持续更新,只需同步一小部分』的情形非常有用。
详细的文档、用例可到官方网站查阅,地址 rsync.samba.org
上传例子 #
比如向远程服务器上传本地目录的命令如下:
> rsync -rtvz 本地目录/ -P 端口 用户@远程主机:/远程目录/
# rsync 支持 ssh 配置连接,ssh 免密方式
> rsync -rtvz 本地目录/ 远程主机:/远程目录/
说明:
-t
表示同步时,上传到远程服务器的文件,保留与本地源文件相同的修改时间-r
上传本地目录下的目录-z
压缩传输,减少带宽消耗-v
上传过程命令行默认没有反馈,添加-v
参数后,会显示传输过程。
某次运行的结果:
building file list ... done
sent 9522 bytes received 20 bytes 19084.00 bytes/sec
total size is 35310774 speedup is 3700.56
全部 35310774
字节,上传了 9522
字节,基本就是发送了目录结构与文件信息去远程服务器进行比较,发现没有需要更新。
不信可以在文件更新后执行同步命令两次,看看是不是第一次命令行会反馈更新文件列表,第二次只是传了几k数据。
删除远程多余文件 #
另外,还有个重要更新选项,如果本地目录已删除,使用 u
参数,可以让远程目录也删除对应文件。
> rsync -rtvzu 本地目录/ -P 端口 用户@远程主机:/远程目录/ --delete
删除动作有以下四种执行时机,没有特殊需求,一般选择 --delete
。
--delete
--delete-before
--delete-during
--delete-delay
具体自己按照实际需要进行学习、测试、体会。
因为增量同步
有时可会非常复杂,如发现上面的简单命令满足不了你的需求,查看 rsync
命令行帮助或手册来辅助寻找解决方案。
rsync --help
获取命令行帮助man rsync
获取比命令行帮助更加详细的说明
目录过滤 #
有时在文件同步时,可能会刻意的让本地与远程服务器的文件不一致,如让 rsync
在文件同步时,忽略本地的某些目录,那每这时可以这样使用:
> rsync -rtvzu ./site/ youwu:/home/public/youwu.today/site/ --delete --exclude 'crawl' --exclude 'resources/*' --exclude 'static/data/*'
上例中命令中的参数,--exclude 'crawl' --exclude 'resources/*' --exclude 'static/data/*'
,表示同步文件时,不同步上传 crawl目录,resources 与 static/data 目录下的文件。