跳到主要内容
  1. Skills/
  2. 建站/

使用 rsync 实现文件同步

··字数 1360·3 分钟
scp rsync 文件同步 howto

本文介绍本地文件向远程文件上传文件、并可以保持同步的简单方法,这些工具都是 linux 服务器支持的。

这在需要服务器间传递、同步数据,或者在本地向远程服务器上传同步网站页面代码时,非常简单高效。

scp 全目录上传 #

scp 是基于 ssh 的文件传输工具,使用下面的命令可以将本地目录的数据文件上传到服务器。 每次上次都是整个本地目录上传,不支持增量同步(即第一次上传后,不支持后面每次只上传修改的文件)。

例子 #

> scp -rp 本地目录 -P 端口 用户@远程主机:/远程目录
# 如果配置了 `ssh` 免密登录的,可使用下面的简化命令
> scp -rp 本地目录 ssh配置名:/远程目录

如何配置 ssh 别名,可看本站文章

说明:

  • 本地目录远程目录 之后有没 / 这个斜杠,效果是有差别的。
    • 如果是 本地目录 ,表示上传本地目录中的所有文件,结果为 远程目录/本地目录
    • 如果是 本地目录/远程目录/,表示上传到远程服务器,本地目录 对应 远程目录,不会产生 远程目录/本地目录 这个结果。
  • 参数 -r 表示 上传本地目录文件是,文件夹与其下的目录都上传
  • 参数 -p 表示 上传到服务器的文件保留与本地一样的 文件修改时间访问时间访问权限

若上传的数据目录中带有软链接,不要使用 scp 同步,因为会丢失。采用其它工具或者先将文件夹打包后上传,在远程服务器上解包。

rsync 可增量同步(增量更新) #

rsyncscp 类似,所有命令格式非常接近。不同的是,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目录,resourcesstatic/data 目录下的文件。