0%

Linux rsync

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
2
3
4
5
6
$ rsync -rv user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
a
b
c

显示详细进度

对于小文件而言,没有问题,但是如果文件比较大,比如有几个GB,那么此时--progress参数就会比较有帮助:

1
2
3
4
5
6
7
$ rsync -rv --progress user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
30 files to consider
a 100% 278.25MB/s 0:02:00 (xfer#1, to-check=28/30)
b 100% 289.25MB/s 0:02:00 (xfer#1, to-check=27/30)
c 100% 277.45MB/s 0:02:00 (xfer#1, to-check=26/30)

会实时更新传输的进度。

此时对比scp,可以看到多了一些提示信息,比如会提示:

receiving file list … done
30 files to consider

另外,在实时更新的进度里面也有了一些多出来的信息。

不传输一些文件

比如做软件开发,不希望传输一些编译过程中产生的.o文件,测试的--exclude参数就很完美,如下:

1
2
3
4
5
6
7
$ rsync -rv --progress --exclude "*.o" user@192.168.100.123:~/dest_file dir/
user@192.168.100.123's password:
receiving file list ... done
25 files to consider
a 100% 278.25MB/s 0:02:00 (xfer#1, to-check=28/30)
b 100% 289.25MB/s 0:02:00 (xfer#1, to-check=27/30)
c 100% 277.45MB/s 0:02:00 (xfer#1, to-check=26/30)

此时就看到,本来该传输30组的数据,去掉了部分.o文件。

rsync特性

高效地复制同步数据到对端,或者对端到本地
支持复制链接、设备、属主、属组、权限
比scp(Secure Copy)更快。rsync使用远程更新协议( remote-update protocol ),这允许仅仅传输两组文件之间的差异。对于首次传输,它将文件或目录的全部内容从源复制到目标,但是从下次起,它仅将变化部分复制到目标。
Rsync消耗较少的带宽,因为它使用压缩和解压缩方法,同时发送和接收数据两端。HTTP压缩技术

基本语法

1
2
3
4
5
6

--delete 同步时,删除那些DST中有,而SRC没有的文件
--max-size:限定传输文件大小的上限
--dry-run:显示那些文件将被传输,并不会实际传输
--bwlimit:限制传输带宽
-W:拷贝文件,不进行增量检测

使用范例:

本地拷贝到远程

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/
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道