rsync网络文件传输

要使rsync在两台主机之间运作,必须让它在源机器和目标机器上面都安装。rsync也可以在同一台机器上进行文件和目录的复制。

rsync not found 
rsync: connection unexpectedly closed (0 bytes read so far) 
rsync error: error in rsync protocol data stream (code 12) at io.c(165)
#这个信息是说,在远端找不到rsync。

如果远端安装了rsync,但没在路径中,用--rsync-path=path来指定远端中它的位置。

只复制文件,不复制目录

表面上,rsync命令跟scp没什么区别。在所有现代操作系统中,rsync都假设你是用SSH连接远端的。
事实上,rsync可以使用和scp相同的参数。例如,想复制一组文件到你名为host的机器的home目录,就可以输入:

rsync file1 file2 ... user@host:
#默认复制到home目录。
#如果你想复制到其他地方, 可以在host后面加上具体地址。
#相同用户名可省略user@

除非你加了其他选项,不然rsync就只复制文件,不复制目录,此时复制名为dir的目录你就会收到以下信息:skipping directory dir

复制目录

想要完整地、递归地传输整个目录——包括符号链接、权限、模式、设备——那就用-a选项。

rsync -a dir user@host:destination_dir
#执行过后,host机器的destination_dir下就会有了目录dir。
#相同用户名可省略user@

rsync -a dir/ user@host:destination_dir
#rsync就会直接将dir里的内容全部复制到destination_dir中,而不会先在dest_dir建立dir目录

注意以斜杠结尾的目录,如果传输目录和文件时不小心加上了斜杠,跟–delete选项结合使用,那就可能会误删无辜的文件。
注意shell中的文件名补全功能。GNU readline以及其他补全库可能会给完整的目录名加上斜杠。

模拟复制

复制目录是需要技巧的,如果你不清楚传输过程中会发生什么,你可以使用-nv选项组合。
-n选项会让rsync进入“空跑”模式,即模拟复制而非真的复制。
-v选项则是冗长模式,它会将涉及的文件和传输过程的细节显示出来:

 rsync -nva dir host:destination_dir

在没有使用什么特别选项时,rsync的运行会是悄无声息的,只在遇到错误时才会有输出。你可以用rsync -v(冗长模式)来显示传输过程的细节,甚至用rsync -vv来显示得更细。(v越多则越详细,但两个v通常已足够。)想在传输过后得到一些综合信息,可用rsync --stats

准确复制

所谓准确复制,就是将目标目录比源目录多出的内容清除掉。 要想实现这种效果,你可以使用--delete选项:

rsync -a --delete dir user@host:destination_dir

这样做是有点危险的,你需要检查一下会不会误删文件。记住,如果你不确定传输是否能达到理想结果,可先以-n选项模拟复制做一下测试,看看是否会删除文件。

排除文件与目录

rsync -a --exclude=.git src host:
#注意,这条命令会排除所有名为.git的文件与目录,因为这里--exclude获得的是模式,而非一个绝对的文件名。
#模式匹配是以一个完整的文件名为单位的,模式可包含通配符。例如,t*s能与this匹配,但不与ethers匹配。

rsync -a --exclude=item/ src host:
#只想排除名为item的目录,不想排除名为item的文件,可以斜杠结尾:--exclude=item/。

rsync -a --exclude=/src/.git src host:
#要想排除一个特定的项目,那就以“/”开头来指定一个绝对路径,/src/.git开头的/不是指你系统的home目录,而是指源目录所在的位置。

以下还有一些按模式进行排除的技巧。
• --exclude选项可以有多个。
• 常用的模式可保存在文本文件中(一行一个模式),并用–exclude-from=file。
• 如果你发现你要排除的内容太多了,你也可以用--include来指定要包含的文件或目录。

覆写、检查及冗长模式

当检查发现不一致时,rsync会对远端的文件进行覆写。
为了提高效率,rsync会先快速检查一下目标位置是否已包含源内容。这种快速检查只看文件大小及最后修改时间。
如果目标位置已有了大小一致且修改时间一致的原内容,你会发现文件没有传输。
快速检查功能可能不够用,因为你可能还需要更准确地验证两边文件是否一样,以免rsync错误地略过它们,又或者说你想要更多安全保障。这时,你可以求助于以下这些选项。

  • --checksum(缩写-c):通过计算文件的校验和(大部分情况下是唯一的)来检查一致性。这会消耗更多的I/O和CPU资源,但如果你想准确地传输,又担心文件大小不足以判断一致性,那么这个选项就是必须的。
  • --ignore-existing:不覆写已存在的文件。
  • --backup(缩写-b):不覆写已存在的文件,只在传输前给它们加上~后缀,为它们重命名。
  • --suffix=s:将–backup用的后缀~改为s。
  • --update(缩写-u):当目标文件的修改时间比源文件的更早时,才进行覆写。
    在没有使用什么特别选项时,rsync的运行会是悄无声息的,只在遇到错误时才会有输出。
    你可以用rsync -v(冗长模式)来显示传输过程的细节,甚至用rsync -vv来显示得更细。(v越多则越详细,但两个v通常已足够。)想在传输过后得到一些综合信息,可用rsync --stats

压缩后复制

很多人喜欢在用-a的时候加上-z,以在传输前先进行压缩:

$ rsync -az dir host:destination_dir

某些情况下,压缩是能加快传输速度的,例如说上行缓慢,或者说延迟很多,而你又要传输大量文件的情况时。然而,如果网络很快,那么压缩和解压的过程会占用较多CPU时间,此时反而不做压缩会传得更快些。

限制带宽

上传大量数据时,可能会堵塞上行线路。尽管这并不占用下行线路,但如果不限制上传速度,其实也是会影响下行的。因为发出的TCP包(如HTTP请求)需要与你的文件传输争夺带宽。要想避免这种情况,可用--bwlimit来给你的上行线路留点空间。例如,若要令其上行带宽的上限为10 000Kbps,可这么做:

rsync --bwlimit=10000 -a dir host:destination_dir

远端传文件到本地,本地传本地

rsync不仅能从本机传文件到远端,还能从远端传文件到本机,你只需将远端主机名和远端文件路径作为第一个参数即可。
因此,想将远端host的src_dir传到本机的dest_dir,就可以这样写:

rsync -a host:src_dir dest_dir

不填主机名host:的话,意味着是在本机上进行文件复制。

更多有关rsync的话题

无论何时,rsync都应该是文件复制的首选工具之一。rsync的批量模式很有用,它会用到一些辅助文件来记录状态日志。状态日志能使中断的长时传输恢复得更快捷。
rsync还能用于备份。例如,你可以接上一些网络硬盘,如Amazon的S3,到你的Linux系统,然后使用rsync --delete来定期地进行文件同步,这样的备份系统是很高效的。没谈到选项还有很多。想大概了解下的话,可运行rsync --help来查看。此外,rsync(1)帮助手册及其主页http://rsync.samba.org/也提供了详细的参考信息。

参考书

[图灵程序设计丛书].精通Linux.第2版,第12章在网络上传输文件,12.2 rsync,p223-228

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值