rsync 是个非常复杂的命令,当需要用的时候总是需要查看具体的命令行参数说明。最佳实践应该是是结合使用场景去记忆,或者完全不用去记,把常用例子记下来并把功能备注清楚。
rsync 命令基础语法
SYNOPSISLocal:rsync [OPTION...] 源地址... [目的地址]Access via remote shell:Pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push:rsync [OPTION...] SRC... [USER@]HOST:DESTAccess via rsync daemon:Pull:rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]Push:rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)
其中源地址后面带 / 和不带 所表示的意义不同,带 表示同步目录下内容,不带/表示同步目录本身,目标目录带不带/意义一样。
常用选项
--verbose, -v 打印更多细节
--dry-run, -n 干run 即假装执行,不真执行
--human-readable, -h 提高输出可读性
--recursive, -r 递归执行,即对子目录同步
当只有 -rvh 时,功能类似 cp -rf ,并没有增量同步的功能,并且拷贝后的文件属性也会变掉。其中 -n 选项可以打印将要执行的动作,方便检查命令是否符合预期。-h 类似 du -sh 命令中的 -h,主要用于字节转换。
$ rsync -rvh -n src dest
此时的 rsync 达不到增量同步的作用,那么如样可以增量同步呢?加上一个 --size-only 即可以增量同步了。
$ rsync -rvh -size-only -n src dest
常用选项
--size-only 只匹配大小,不匹配时间
--archive, -a 归档模式,实际为 -rlptgoD
--links, -l 将软链接copy为软链接
--perms, -p 保留属性
--times, -t 保留 mtime
--group, -g 保留group属性
--owner, -o 保留owner属性
-D 同 --devices --specials
--devices 保留设备文件
--specials 保留 special 文件
另一种触发同步的机制是比较 mtime,当 mtime 不同时触发更新。-a 选项我们可以理解为原样拷贝,即会把大部分属性都保留,-a 这一条选项实际上是后面那一堆选择的组合。所以正常的同步命令使用下面这条就够了:
$ rsync -avh src dest
如果不想保留文件属性,而是想拷贝后替换成当前用户属性。可以把 -a 拆散了用。比如下面这条就是不保留属性但还能起到同步的作用:
$ rsync -rvh -t src dest
基本上把 -a 选择搞懂了,剩下的什么同步场景都能搞定。同步权限用 -p , 同步 owner 属性用 -o ,同步 group 属性用 -g
$ rsync -rvh -t src dest$ rsync -rvh -t -o src dest$ rsync -rvh -t -g src dest
需要注意的是,rsync 同步的触发机制是 mtime 和 文件大小不一致,当这些都没有变化时,是不会触发同步的。所以当执行一次同步后,owner 和 group 属性是不会变的。权限、用户属性的改变不会改变 mtime 和文件大小。
当 ssh 的端口不为 22 时,此时需要用到 -e 选项
$ rsync -avh -e 'ssh -p 2234' root@server:/src dest$ rsync -avh -e 'ssh -p 2222 -o GSSAPIAuthentication=no -o ServerAliveInterval=60' /pacs/ root@192.168.240.87:/pacs/pacsoldimg/
还有一些其它选项,在某些情况可能会用到:
--mkpath 创建目标目录,支持多级
--copy-links, -L 传递软链接,即会拷贝文件而不是软链接
--one-file-system, -x 不跨文件系统
--list-only 显示文件列表,此时可以不接 dest
--delete 删除目标目录中多出来的文件
最后再说一个有意思的选项 --stats 在同步结束后会给出一个统计信息,有类似如下输出:
$ rsync -rvh -t src dest[...]Number of files: 1,652 (reg: 1,388, dir: 264)Number of created files: 1,652 (reg: 1,388, dir: 264)Number of deleted files: 0Number of regular files transferred: 1,388Total file size: 6.86M bytesTotal transferred file size: 6.86M bytesLiteral data: 6.86M bytesMatched data: 0 bytesFile list size: 0File list generation time: 0.001 secondsFile list transfer time: 0.000 secondsTotal bytes sent: 7.00MTotal bytes received: 27.96Ksent 7.00M bytes received 27.96K bytes 14.05M bytes/sectotal size is 6.86M speedup is 0.98
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




