要使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-path=path 来指定远端中它的位置。
只复制文件,不复制目录
表面上,rsync命令跟scp没什么区别。在所有现代操作系统中,rsync都假设你是用SSH连接远端的。 事实上,rsync可以使用和scp相同的参数。例如,想复制一组文件到你名为host的机器的home目录,就可以输入:
rsync file1 file2 ... user@host:
除非你加了其他选项,不然rsync就只复制文件,不复制目录,此时复制名为dir的目录你就会收到以下信息:skipping directory dir
复制目录
想要完整地、递归地传输整个目录——包括符号链接、权限、模式、设备——那就用-a 选项。
rsync -a dir user@host:destination_dir
rsync -a dir/ user@host:destination_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:
rsync -a --exclude=item/ src host:
rsync -a --exclude=/src/.git src host:
以下还有一些按模式进行排除的技巧。 ? --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
|