Linux rsync 命令
rsync
也是远程(或本地)复制和同步文件最常用的命令。
与scp
类似。
官方定义为:
rsync - a fast, versatile, remote (and local) file-copyint tool
从定义看,比scp
要强一些。
借助rsync
命令,可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步。比如最常用的就是在两台Linux主机之间进行数据的备份。
语法
语法相对而言,比较简单,不过用法其实挺多的。
1 | $ rsync [OPTION...] SRC... [DEST] |
常用的参数为:
-v
: 详细模式输出-r
: 递归拷贝数据,但是传输数据时不保留时间戳和权限-a
: 归档模式, 归档模式总是递归拷贝,而且保留符号链接、权限、属主、属组时间戳-z
: 压缩传输-h
: human-readable--progress
: 显示传输过程--exclude=PATTERN
指定排除传输的文件模式--include=PATTERN
指定需要传输的文件模式
无参数传输
默认情况下,传输一个文件不需要任何参数:
1 | $ rsync user@192.168.100.123:~/dest_file dir/ |
命令执行后,会提示输入远程机器的密码,不过成功后不会显示任何信息,需要自行确认。
常用传输
所以默认情况下,会使用rv参数,不仅可以传输一个目录,也可以是文件:
1 | $ rsync -rv user@192.168.100.123:~/dest_file dir/ |
显示详细进度
对于小文件而言,没有问题,但是如果文件比较大,比如有几个GB,那么此时--progress
参数就会比较有帮助:
1 | $ rsync -rv --progress user@192.168.100.123:~/dest_file dir/ |
会实时更新传输的进度。
此时对比scp,可以看到多了一些提示信息,比如会提示:
receiving file list … done
30 files to consider
另外,在实时更新的进度里面也有了一些多出来的信息。
不传输一些文件
比如做软件开发,不希望传输一些编译过程中产生的.o
文件,测试的--exclude
参数就很完美,如下:
1 | $ rsync -rv --progress --exclude "*.o" user@192.168.100.123:~/dest_file dir/ |
此时就看到,本来该传输30组的数据,去掉了部分.o
文件。
rsync特性
高效地复制同步数据到对端,或者对端到本地
支持复制链接、设备、属主、属组、权限
比scp(Secure Copy)更快。rsync使用远程更新协议( remote-update protocol ),这允许仅仅传输两组文件之间的差异。对于首次传输,它将文件或目录的全部内容从源复制到目标,但是从下次起,它仅将变化部分复制到目标。
Rsync消耗较少的带宽,因为它使用压缩和解压缩方法,同时发送和接收数据两端。HTTP压缩技术
基本语法
1 |
|
使用范例:
本地拷贝到远程
1 | $ rsync -avz localfile user@ip:/the/path/ |
传输数据时显示传输过程
使用–progress参数
使用–exclude和–include
传输dat开头的文件、目录,排除其他情况的文件、目录
1 | $ rsync -avz --include 'dat*' --exclude '*' /local/path/ user@ip:/the/path |
使用–delete
–delete用于同步时,删除那些DST中有,而SRC没有的文件
传输完毕后自动删除源文件、目录, 可以使用–remove-source-files选项完成此自动删除。
使用–dry-run
如果你对rsync不熟悉,贸然使用rsync可能会搞乱对端文件、目录。借助–dry-run可以让你知道会传输些什么东西,但实际上并没有传输任何东西。如果输出结果与你的预期吻合,可以去掉–dry-run,进行实际的传输工作。
同步整个文件
rsync由于采用远程更新协议( remote-update protocol ),默认是同步变化的字节或块。使用-W可以取消这种机制,整个文件同步
指定端口
下个示例通过指定12345端口进行数据传输。
1 | rsync -e 'ssh -p 12345' -avz localfile user@ip:/the/path/ |