rsync [OPTION]... SRC DEST
推荐在 SSH 的基础上使用rsync
。能够事先在~/.ssh/config
中加入配置,这样远端能够写做SSH配置名:路径
。html
目录SRC
是否以斜杠结尾,会影响同步的结果:linux
DEST
里面有 [目录SRC
自己]DEST
里面有 [目录SRC
里面的文件]目录DEST
是否以斜杠结尾,对同步的结果没有任何影响。算法
转载注:shell
- 标题:rsync 同步的艺术
- 做者:roc
- 原文:http://roclinux.cn/?p=2643
若是你是一位运维工程师,你极可能会面对几十台、几百台甚至上千台服务器,除了批量操做外,环境同步、数据同步也是必不可少的技能。bash
说到“同步”,不得不提的利器就是rsync
,今天就来讲说我从这个工具中看到的同步的艺术。服务器
咱们常常这样使用rsync
:网络
$ rsync main.c machineB:/home/userB
只要目的端的文件内容和源端不同,就会触发数据同步,rsync
会确保两边的文件内容同样。运维
但rsync
不会同步文件的 modify time ,凡有数据同步的文件,目的端的文件的 modify time 老是会被修改成最新时刻的时间。ssh
rsync
不会太关注目的端文件的 rwx 权限,若是目的端没有此文件,那么权限会保持与源端一致;若是目的端有此文件,则权限不会随着源端变动。ide
只要rsync
有对源文件的读权限,且对目标路径有写权限,rsync
就能确保目的端文件同步到和源端一致。
rsync
只能以登录目的端的帐号来建立文件,它没有能力保持目的端文件的输主和属组和源端一致。除非你使用 root 权限,才有资格要求属主一致、属组一致。
咱们常常这样使用-t
选项:
$ rsync -t main.c machineB:/home/userB
使用-t
选项后,rsync
总会想着一件事,那就是将源文件的 modify time 同步到目标机器。
带有-t
选项的rsync
,会变得更聪明些,它会在同步前先对比两边文件的时间戳和文件大小,若是一致,则就认为两边文件同样,对此文件就再也不采起更新动做了。
由于rsync
的聪明,也会反被聪明误。若是目的端的文件的时间戳、大小和源端彻底一致,可是内容恰巧不一致时,rsync
是发现不了的。这就是传说中的“坑”!
对于rsync
自做聪明的状况,解决办法就是使用-I
选项。
咱们常常这样使用-I
选项:
$ rsync -I main.c machineB:/home/userB
-I
选项会让rsync
变得很乖很老实,它会挨个文件去发起数据同步。
-I
选项能够确保数据的一致性,代价即是速度上会变慢,由于咱们放弃了 quick check 策略。 quick check 策略,就是先查看文件的时间戳和文件大小,依次先排除一批认为相同的文件。
不管状况如何,目的端的文件的 modify time 总会被更新到当前时刻。
这个选项,简单易懂,就是让rsync
输出更多的信息,咱们能够举一个例子:
$ rsync -vI main.c machineB:/home/userB main.c sent 81 bytes received 42 bytes 246.00 bytes/sec total size is 11 speedup is 0.09
你增长越多的v,就能够得到越多的日志信息。
$ rsync -vvvvt abc.c machineB:/home/userB cmd= machine=machineB user= path=/home/userB cmd[0]=ssh cmd[1]=machineB cmd[2]=rsync cmd[3]=--server cmd[4]=-vvvvte. cmd[5]=. cmd[6]=/home/userB opening connection using: ssh machineB rsync --server -vvvvte. . /home/userB note: iconv_open("ANSI_X3.4-1968", "ANSI_X3.4-1968") succeeded. (Client) Protocol versions: remote=28, negotiated=28 (Server) Protocol versions: remote=30, negotiated=28 [sender] make_file(abc.c,*,2) [sender] flist start=0, used=1, low=0, high=0 [sender] i=0 abc.c mode=0100664 len=11 flags=0 send_file_list done file list sent send_files starting server_recv(2) starting pid=31885 recv_file_name(abc.c) received 1 names [receiver] i=0 abc.c mode=0100664 len=11 recv_file_list done get_local_name count=1 /home/userB recv_files(1) starting generator starting pid=31885 count=1 delta transmission enabled recv_generator(abc.c,0) abc.c is uptodate generate_files phase=1 send_files phase=1 recv_files phase=1 generate_files phase=2 send files finished total: matches=0 hash_hits=0 false_alarms=0 data=0 generate_files finished recv_files finished client_run waiting on 14318 sent 36 bytes received 16 bytes 104.00 bytes/sec total size is 11 speedup is 0.21 _exit_cleanup(code=0, file=main.c, line=1031): entered _exit_cleanup(code=0, file=main.c, line=1031): about to call exit(0)
这是个压缩选项,只要使用了这个选项,rsync
就会把发向对端的数据先进行压缩再传输。对于网络环境较差的状况下建议使用。
通常状况下,-z
的压缩算法会和 gzip 的同样。
咱们在第一次使用rsync
时,每每会遇到这样的囧境:
$ rsync superman machineB:/home/userB skipping directory superman
若是你不额外告诉rsync
你须要它帮你同步文件夹的话,它是不会主动承担的,这也正是rsync
的懒惰之处。
因此,若是你真的想同步文件夹,那就要加上-r
选项,即 recursive(递归的、循环的),像这样:
$ rsync -r superman machineB:/home/userB
咱们在上面的讲解中说过,若是时间戳和文件大小彻底一致,只有文件内容不一样,且你没有使用-I
选项的话,那么,rsync
是不会进行数据同步的。
那么,提个问题:“由于在Linux的世界里,文件夹也是文件,若是这类文件(文件夹)也只有内容不一样,而时间戳和文件大小都相同,rsync
会发现么?”
实验你们能够本身动手作,结论在这里告诉你们:
对于文件夹,rsync
是会明察秋毫的,只要你加了-r
选项,它就会恪尽职守的进入到文件夹里去检查,而不会只对文件夹自己作 quick check 的。
若是咱们要同步一个软连接文件,你猜rsync
会提示什么?
$ ll total 128 -rw-rw-r-- 1 userA userA 11 Dec 26 07:00 abc.c lrwxrwxrwx 1 userA userA 5 Dec 26 11:35 softlink -> abc.c $ rsync softlink machineB:/home/userB skipping non-regular file "softlink"
嗯,你猜对了,rsync
又无情地拒绝了咱们。它一旦发现某个文件是软连接,就会无视它,除非咱们增长-l
选项。
$ rsync -l softlink machineB:/home/userB
使用了-l
选项后,rsync
会彻底保持软连接文件类型,原本来本的将软连接文件复制到目的端,而不会 follow link 到指向的实体文件。
若是我恰恰就想让rsync
采起 follow link 的方式,那就用-L
选项就能够了。你能够本身试试效果。
这个选项的全名是 perserve permissions,顾名思义,就是保持权限。
若是你不使用此选项的话,rsync
是这样来处理权限问题的:
若是你使用了-p
选项,则不管如何,rsync
都会让目的端保持与源端的权限一致的。
这两个选项是一对,用来保持文件的属组(group)和属主(owner),做用应该很清晰明了。不过要注意的一点是,改变属主和属组,每每只有管理员权限才能够。
-D
选项,原文解释是 preserve devices (root only),从字面意思看,就是保持设备文件的原始信息。因为博主没有实际体验过它的好处,因此没有太多发言权。
-a
选项是rsync
里比较霸道的一个选项,由于你使用-a选项,就至关于使用了-rlptgoD
这一坨选项。以一敌七,惟-a
选项也。(在看了前文以后,你应该能够很轻松的理解这七个选项的做用了。)
-a
选项的学名应该叫作 archive option,中文叫作归档选项。使用-a
选项,就代表你但愿采起递归方式来同步,且尽量的保持各个方面的一致性。
可是-a
选项也有阿克琉斯之踵,那就是-a
没法同步“硬连接”状况。若是有这方面需求,要加上-H
选项。
若是源端没有此文件,那么目的端也别想拥有,删除之。
-delete
选项必须和-r
选项搭配使用。
专门指定一些要在目的端删除的文件。
-delete-excluded
选项必须和-r
选项搭配使用。
默认状况下,rsync
是先清理目的端的文件再开始数据同步;若是使用此选项,则rsync
会先进行数据同步,都完成后再删除那些须要清理的文件。
-delete-after
选项必须和-r
选项搭配使用。
看到这么多 delete,你是否有点肝颤? 的确,在rsync
的官方说明里也有这么一句话:
This option can be dangerous if used incorrectly! It is a very good idea to run first using the dry run option (-n) to see what files would be deleted to make sure important files aren't listed.
从这句话里,咱们学到了一个小技巧,那就是-n
选项,它是一个吓唬人的选项,它会用受影响的文件列表来警告你,但不会真的去执行,这就让咱们有了确认的机会和回旋的余地。咱们看看实际用法吧:
$ rsync -n --delete -r . machineB:/home/userB/ deleting superman/xxx deleting main.c deleting acclink
若是你不但愿同步一些东西到目的端的话,可使用-exclude
选项来隐藏,rsync
仍是很重视你们隐私的,你能够屡次使用-exclude
选项来设置不少的“隐私”。
若是你要隐藏的隐私太多的话,在命令行选项中设置会比较麻烦,rsync
仍是很体贴,它提供了-exclude-from
选项,让你能够把隐私一一列在一个文件里,而后让rsync
直接读取这个文件就行了。
这两个选项的做用是:从新加入已经被-exclude
或-exclude-from
选项排除的文件。
-include
选项能够被屡次使用。-include-from
选项用于指定文件中读取文件列表。
请注意 exclude 和 include 的前后顺序。先 exclude 再 include。
这就是传说中的断点续传功能。默认状况下,rsync
会删除那些传输中断的文件,而后从新传输。但在一些特别状况下,咱们不但愿重传,而是续传。
咱们在使用中,常常会看到有人会使用-P
选项,这个选项实际上是为了偷懒而设计的。之前人们老是要手动写-partial -progress
,以为太费劲了,倒不如用一个新的选项来代替,因而-P
应运而生了。有些读者会问-partial
我知道做用了,可-progress
是干什么用的呢?为何不少人要使用它呢,它有那么大的吸引力?
真有……
使用这个选项,rsync
会显示出传输进度信息,有什么用呢,rsync
给了一个颇有意思的解释:
This gives a bored user something to watch.
好了,写了这么多,你们看的已经很乏味了,去实际用用-progress
解解闷,是个不错的选择。^_^
PS:后续会讲解有关rsync
的-exclude
的 PATTERN 语法。
谢谢!
转载注:
- 标题:rsync 命令参数详解
- 做者是:subsir
- 原文地址:https://www.cnblogs.com/subsi...
-v, --verbose 详细模式输出。 -q, --quiet 精简输出模式。 -c, --checksum 打开校验开关,强制对文件传输进行校验。 -a, --archive 归档模式,表示以递归方式传输文件,并保持全部文件属性,等于 -rlptgoD。 -r, --recursive 对子目录以递归模式处理。 -R, --relative 使用相对路径信息。 -b, --backup 建立备份,也就是对于目的已经存在有一样的文件名时,将老的文件从新命名为 ~filename。可使用 --suffix 选项来指定不一样的备份文件前缀。 --backup-dir 将备份文件(~filename)存放在在目录下。 -suffix=SUFFIX 定义备份文件前缀。 -u, --update 仅仅进行更新,也就是跳过全部已经存在于 DST,而且文件时间晚于要备份的文件。(不覆盖更新的文件。) -l, --links 保留软链结。 -L, --copy-links 想对待常规文件同样处理软链结。 --copy-unsafe-links 仅仅拷贝指向 SRC 路径目录树之外的链结。 --safe-links 忽略指向 SRC 路径目录树之外的链结。 -H, --hard-links 保留硬链结。 -p, --perms 保持文件权限。 -o, --owner 保持文件属主信息。 -g, --group 保持文件属组信息。 -D, --devices 保持设备文件信息。 -t, --times 保持文件时间信息。 -S, --sparse 对稀疏文件进行特殊处理以节省 DST 的空间。 -n, --dry-run 显示哪些文件将被传输(新增、修改和删除)。 -W, --whole-file 拷贝文件,不进行增量检测。 -x, --one-file-system 不要跨越文件系统边界。 -B, --block-size=SIZE 检验算法使用的块尺寸,默认是 700 字节。 -e, --rsh=COMMAND 指定使用 rsh, ssh 方式进行数据同步。 --rsync-path=PATH 指定远程服务器上的 rsync 命令所在路径信息。 -C, --cvs-exclude 使用和 CVS 同样的方法自动忽略文件,用来排除那些不但愿传输的文件。 --existing 仅仅更新那些已经存在于 DST 的文件,而不备份那些新建立的文件。 --delete 删除那些 DST 中 SRC 没有的文件。 --delete-excluded 一样删除接收端那些被该选项指定排除的文件。 --delete-after 传输结束之后再删除。 --ignore-errors 即便出现 IO 错误也进行删除。 --max-delete=NUM 最多删除 NUM 个文件。 --partial 保留那些因故没有彻底传输的文件,以便实现断点续传。 --force 强制删除目录,即便不为空。 --numeric-ids 不将数字的用户和组 ID 匹配为用户名和组名。 --timeout=TIME IP 超时时间,单位为秒。 -I, --ignore-times 不跳过那些有一样的时间和长度的文件。 --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为 0。 -T --temp-dir=DIR 在 DIR 中建立临时文件。 --compare-dest=DIR 一样比较 DIR 中的文件来决定是否须要备份。 --progress 显示传输过程。 -P 等同于 -partial -progress。 -z, --compress 对备份的文件在传输时进行压缩处理。 --exclude=PATTERN 指定排除不须要传输的文件模式。 --include=PATTERN 指定不排除而须要传输的文件模式。 --exclude-from=FILE 排除 FILE 中指定模式的文件。 --include-from=FILE 不排除 FILE 指定模式匹配的文件。 --version 打印版本信息。 --address 绑定到特定的地址。 --config=FILE 指定其余的配置文件,不使用默认的 rsyncd.conf 文件。 --port=PORT 指定其余的 rsync 服务端口。 --blocking-io 对远程 shell 使用阻塞 IO。 --stats 给出某些文件的传输状态。 --log-format=formAT 指定日志文件格式。 --password-file=FILE 从 FILE 中获得密码。 --bwlimit=KBPS 限制 I/O 带宽,KBytes per second。 -h, --help 显示帮助信息。