Rsync命令和cp命令很像,但是功能似乎更加复杂点,主要用来备份数据。看了网上一堆介绍的文章,感觉不是很通俗易懂。下面按照我的理解,做一些笔记:

同步方式

之前接触过一些同步软件,例如坚果云、百度云盘等等,他们对于同步方式都是有一些选择项的,下面列举一些同步方式

单向同步

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中;目标目录中对应源目录中已经删除的文件,将被删除。此方式只是单向地对文件进行从源目录到目标目录的操作。如果您手工对目标目录进行的任何文件操作,将被任务忽略。

双向同步

每次执行任务时,不管源目录还是目标目录中新建和更新的文件都会被复制到另外一个目录中;在任何一个目录中删除文件,另外一个目录也会删除对应的文件。当两个目录中文件的操作重叠时,任务会自动保留最新的操作。如果操作时间无法判断,更新和新建文件的操作会优于删除文件而被保留。此方式会对源目录进行文件操作。

镜像同步

每次执行任务时,任何在源目录中新建或在目标目录中删除或在两个目录中更新的文件,都会从源目录复制到目标目录。任何在源目录中删除或在目标目录中新建的文件都会从目标目录中删除。此方式始终保持目标目录中的文件和源目录中的文件一模一样,任何目标目录自身的文件变化将被去除。此方式会删除目标目录中多余的文件。

移动同步

每次执行任务时,源目录中的任何文件都会被移动到目标目录中去。目标目录中如果存在相同文件将被覆盖。移动后,源目录被清空。

更新同步

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中,目标目录中任务之前复制的所有文件将被删除,只保留最新的文件。

累加同步

每次执行任务时,源目录中新建和更新的文件将被复制到目标目录中,目标目录中的任何文件都不会被删除。目标目录中会保留所有在源目录中曾经出现过的文件且都是最后一个版本。

增量备份

每次执行任务时,任务发现源目录中有新建或更新的文件,则在目标目录中建立一个子目录来保存这些新文件。虽然保存的文件只反映了执行时源目录的一部分,但您可以利用软件中提供的文件恢复工具来恢复出执行时源目录完整的目录结构和所有文件。增量备份任务第一次执行时,会自动对源目录做一次完全备份,以便以后能完全恢复。

完全备份

每次执行任务时,任务会在目标目录中建立一个子目录来保存源目录中的所有文件。

除双向同步和镜像同步外,其它方式的任务在执行时,如果发现源目录中的文件没有发生变化,将不做任何处理,只会记录一个最后检查时间。双向同步和镜像同步如果碰到源目录和目标目录中的文件都没有变化的情况,也将只记录一个最后检查时间。

除双向同步和镜像同步外,其它方式的任务对于用户直接对目标目录进行新建、更新、删除的文件不做处理。也就是说,不是任务复制到目标目录而存在的文件,任务认为它不存在,不是被任务删除的文件,任务认为文件还在目标目录中存在。

除双向同步和移动同步外,其它方式的任务不会对源目录进行文件操作。

Rsync的命令格式可以为以下六种:

  • rsync [OPTION]... SRC DEST
  • rsync [OPTION]... SRC [USER@]HOST:DEST
  • rsync [OPTION]... [USER@]HOST:SRC DEST
  • rsync [OPTION]... [USER@]HOST::SRC DEST
  • rsync [OPTION]... SRC [USER@]HOST::DEST
  • rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync 参数理解

  • -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
  • -e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
  • -r, --recursive 对子目录以递归模式处理。
  • -l, --links保留软链结。
  • -L, --copy-links 想对待常规文件一样处理软链结。
  • -K, --keep-dirlinks treat symlinked dir on receiver as dir
  • -v, --verbose 详细模式输出。
  • -z, --compress 对备份的文件在传输时进行压缩处理。

--deldete

–delete:如果源端没有此文件,那么目的端也别想拥有,删除之。(如果你使用这个选项,就必须搭配 -r 选项一起)

--delete 删除那些 DST 中 SRC 没有的文件,就是说,DST 中如果存在和 SRC 不一样的文件,那么这些文件就会在同步过程中删除!这种同步方式是不是有点像镜像同步

为了搞清楚目录加/的区别,做了如下的对比:

目的:将源目录test传输到远程目录/tmp下,即远程目录下/tmp/test

1.源目录加斜线,目标目录不加斜线:

结果显示,加了斜线,会将源目录下的文件,传输到目标目录下。

如果目标目录不存在,会创建目录。

rsync -avlK ./test/ root@10.22.44.103:/tmp/test
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
./
a.txt
b.py
dd/ sent 208 bytes received 97 bytes 55.45 bytes/sec
total size is 0 speedup is 0.00 root@SZX1000395393:/tmp/test# ls
a.txt b.py dd

2.源目录不加斜线,目标目录不加斜线

不加斜线,直接将源目录复制到目标目录下,所以,test整个目录复制到了目标目录下了。

root at node1 in /tmp
$ rsync -avlK ./test root@10.22.44.103:/tmp/test
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
test/
test/a.txt
test/b.py
test/dd/ sent 219 bytes received 98 bytes 57.64 bytes/sec
total size is 0 speedup is 0.00 root@SZX1000395393:/tmp# cd test/
root@SZX1000395393:/tmp/test# ls
test
root@SZX1000395393:/tmp/test# cd test
root@SZX1000395393:/tmp/test/test# ls
a.txt b.py dd

3. 源目录不加斜线,目标目录加斜线:

不加斜线,直接将源目录复制到目标目录下,所以,test整个目录复制到了目标目录下了。

$ rsync -avlK ./test root@10.22.44.103:/tmp/test/
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
test/
test/a.txt
test/b.py
test/dd/ sent 219 bytes received 98 bytes 70.44 bytes/sec
total size is 0 speedup is 0.00 root@SZX1000395393:/tmp# cd test/
root@SZX1000395393:/tmp/test# ls
test

4. 源目录加斜线,目标目录加斜线:

结果显示,加了斜线,会将源目录下的文件,传输到目标目录下。

$ rsync -avlK ./test/ root@10.22.44.103:/tmp/test/
root@10.22.44.103's password:
sending incremental file list
created directory /tmp/test
./
a.txt
b.py
dd/ sent 208 bytes received 97 bytes 55.45 bytes/sec
total size is 0 speedup is 0.00 root@SZX1000395393:/tmp/test# ls
a.txt b.py dd

总结

  • 源目录加了斜线,效果就是将该目录下的内容传输到目标目录下。
  • 源目录不加斜线,效果就是将该目录传输到目标目录下。
  • 目标目录如果不存在,会自动创建目标目录。

所以,为了实现最初的目的,可以通过:

$ rsync -avlK ./test/ root@10.22.44.103:/tmp/test

或者:

$ rsync -avlK ./test root@10.22.44.103:/tmp

-a 选项

  1. -a 选项是rsync里比较霸道的一个选项,因为你使用-a选项,就相当于使用了 -rlptgoD 这一坨选项。以一敌七,唯 -a选项也。(在看了前文之后,你应该可以很轻松的理解这七个选项的作用了)
  2. -a 选项的学名应该叫做 archive option,中文叫做归档选项。使用 -a` 选项,就表明你希望采取递归方式来同步,且尽可能的保持各个方面的一致性。
  3. 但是 -a选项也有阿克琉斯之踵,那就是-a无法同步“硬链接”情况。如果有这方面需求,要加上-H选项

实例

加不加 / 的区别

  • 末尾不加/,表示的是将src这个目录直接复制到文件夹下,如果dst目录下没有src,会自动创建src目录
$ rsync -avzh --progress /apkg/backup/src /apkg/backup/dst
  • 末尾加/,表示的是将src目录下的内容复制到dst2文件夹下
$ rsync -avzh --progress /apkg/backup/src/ /apkg/backup/dst2

同步时,创建目录

将本地机器上/data/repo/Log/中的内容,归档到远程机器上的/data/repo/Log/{repo}/ 目录中,{repo} 这个目录远程不一定有,需要创建:

rsync -avzh --progress --rsync-path="mkdir -p /data/repo/Log/{repo} && rsync " /tmp/{repo}/{repo}/log/ root@xxx.xxx.xxx.xxx:/data/repo/Log/{repo}/

参考

rsync -aL

示例:

一次传输多个文件到目标文件夹下

rsync -aL /apkg/FusionSwift/package_pool/DLRN_RPMS/current/cps-swift.noarch.rpm /apkg/FusionSwift/package_pool/DLRN_RPMS/current/cps-swift-proxy.noarch.rpm /apkg/FusionSwift/rpm_srv/euleros/2.0/noarch/

-e

示例:

rsync -avzKq --stats -e "ssh -i /usr/lib/python2.7/site-packages/apkg/actions/pool/id_rsa -o StrictHostKeyChecking=no" cps-pkg-pool-2.xxx.com:/data/cps/repo/FusionSwift/master/xxx/euler

## 参考
- [《rsync同步的艺术》–linux命令五分钟系列之四十二](http://roclinux.cn/?p=2643) 推荐,详细叙述了各选项的意义
- [RSYNC 的核心算法](https://coolshell.cn/articles/7425.html)
- [Linux命令中:rsync和cp之间的区别](https://www.cnblogs.com/kex1n/p/7008178.html)
- [使用 rsync 增量同步备份文件 ](http://einverne.github.io/post/2017/07/rsync-introduction.html)
- [Rsync命令详解](http://blog.csdn.net/u010391029/article/details/51746641)
- [第2章 rsync(一):基本命令和用法](https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog243)
- [Rsync(远程同步):10 Linux中Rsync命令的实际示例](https://www.howtoing.com/rsync-local-remote-file-synchronization-commands)
- [FileGee的8种同步和备份方式](http://www.sohu.com/a/121958339_365148)

Linux rsync 命令学习的更多相关文章

  1. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  2. Linux常用命令学习4---(挂载命令mount umount、用户登陆查看和用户交互命令 w who last lastlog)

    紧接着上一篇Linux的命令行的学习:Linux学习3---(文件的压缩和解压缩命令zip unzip tar.关机和重启命令shutdown reboot……) 1.挂载命令     简介      ...

  3. Linux rsync 命令详解

    服务器之间常常要保持些文件或目录的一致,比如一些大的软件下载网站,它们通常使用多台服务器来提供下载服务.当一台服务器上的文件更新后,其它的服务器 也需要更新,而且 在更新的时候应该是只对新增或是修改过 ...

  4. 【Linux】命令学习笔记和总结

    莫名的想学习一下Linux了,因为对这方面的知识储备为0.对于命令行界面始终是零接触零了解,对一个程序员来说这几乎是致命的,所以简单了解一下. 一.教程参考 参考菜鸟教程即可: Linux 教程 | ...

  5. Linux常用命令学习

    1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...

  6. linux sort命令学习

    linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...

  7. linux source命令学习

    1. linux source命令的作用? 我们可能经常需要修改到诸如/etc/profile,~/.bash_profile等这样的配置文件, 一方面我们希望所作的修改在当前的环境中立即生效: 另一 ...

  8. linux (ubuntu) 命令学习笔记

    1, md5sum 输出字符串的MD5值 echo -n 123456 | md5sum //-n表示不打印回车符 2, ubuntu设置dock任务栏鼠标点击效果 16.04: 调整位置:gsett ...

  9. linux基础命令学习(六)文件的特殊属性

    Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途.    b:不更新文件或目录的最后存取 ...

随机推荐

  1. 利用Nuget打包添加tools下intsall.ps1【powershell脚本】修改.csproj文件

    利用Nuget打包添加tools下intsall.ps1[powershell脚本]修改.csproj文件, 以设置1.项目-生成->输出->选择[XML文件文件] 2.项目->调试 ...

  2. java详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  3. caffe深度学习进行迭代的时候loss曲线开始震荡原因

    1:训练的batch_size太小 1.       当数据量足够大的时候可以适当的减小batch_size,由于数据量太大,内存不够.但盲目减少会导致无法收敛,batch_size=1时为在线学习. ...

  4. 06 str() bytes() 编码转换

    x = str() #创建字符串#转换成字符串,字节,编码 m = bytes()#创建字节#转换成字节,字符串,要编程什么编码类型的字节 a = "李露" b1 = bytes( ...

  5. Eureka (数学组合 + 斜率)

    由于斜率的储存精度不够,所以使用最简分数表示记录. 合并同一个位置上的点,然后统计个数,利用公式先求出至少包含2个点的数量. 然后再是求某位之上的点与某一斜率的个数,那就是每边至少一个点的个数相乘. ...

  6. PGPDesktop在win7环境下的安装和使用

    PGPDesktop在win7环境下的安装和使用 PGP的简介 PGP(Pretty Good Privacy),是一个基于RSA公钥加密体系的邮件加密软件,它提供了非对称加密和数字签名,是目前非常流 ...

  7. 4.7 引入NULL对象

    [1]引入NULL对象范例 Book.h #ifndef _BOOK_H #define _BOOK_H #include <string> using namespace std; cl ...

  8. python 读csv文件时,在csv类型上执行类型转换

    csv 产生的数据都是字符串类型的,它不会做任何其他类型的转换.如果需要做这样的类型转换,必须自己手动去实现 import csv,re from collections import namedtu ...

  9. 【Alpha版本】冲刺阶段——Day2

    [Alpha版本]冲刺阶段--Day2 阅读目录 今日进展 问题困难 明日任务 今日贡献量 站立式会议 TODOlist [今日进展] 密码算法方面: 存储密码的步骤 使用CSPRNG生成一个长度足够 ...

  10. Django之MVC和MTV

    一. MVC MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列表). ...