', 'auto'); ga('send', 'pageview'); 明明白白的赛特 – rsync用法总结

rsync用法总结

在 2024-02-07 发布于 工具 分类

rsync是一个用于同步文件和目录的工具,它支持本地和远程同步。它能够计算出需要同步的数据的差异,并且只对差异部分进行数据传送,因此在要同步的文件和目录数据量大的时候,或者网络条件不好的时候能有相对很高的性能。rsync既可以通过自有协议进行同步(需要服务器上运行了rsync服务),也可以通过SSH进行同步。

rsync命令简单用法

本地文件同步

类似于cp命令

rsync /etc/passwd /home/passwd.bak

目录递归同步

通过指定-r--recursive参数,可以对两个目录进行同步。此时需要注意,在指定源目录的时候,加不加结尾的'/'含以上会有不同:

# 如果指定了结尾的'/',则将目录下的内容复制到目标位置
# 这个命令执行完后,/tmp下将会有一堆/etc下的文件和目录
rsync -r /etc/ /tmp/

# 如果不指定结尾的'/',则将源目录本身复制到目标位置
# 下面这个命令执行完后,/tmp下将会有一个etc子目录,etc子目录下的内容和原来的/etc下的内容相同
rsync -r /etc /tmp/

另一个需要注意的点是,如果目标是一个目录,最好总是带上'/',这样可以避免意料之外的文件覆盖。

通过ssh和远程同步文件

# 将远程文件复制到本地
rsync -v -e "ssh -p 22" root@192.168.31.201:/home/passwd /tmp/

# 将本地文件复制到远程
rsync -v -e "ssh -p 22" /root/c.sh root@192.168.31.201:/home/

这里-v表示增加输出信息的量。也可以用-vv, -vvv增加更多的输出信息。

-e “ssh -p 22" 表示通过ssh连接远程服务,ssh服务的端口是22。

归档模式

所谓的归档模式,就是在同步文件的时候,保留文件的一些元属性信息(比如时间戳,权限等)。归档模式通过-a选项打开。

rsync --progress -a /source /destination

这里--progress选项指定显示文件同步进度。

rsync命令高级用法

过滤规则

过滤规则允许我们指定在同步过程中需要排除/包含的文件或目录。我们通过例子来说明过滤规则的写法。

例子1:不同步src目录下的zip文件

rsync -r -f '- *.zip' src/ target/

注意这里是目录同步,所以需要指定-r参数,否则无论是否指定规则都不会进入到src里面查找文件。

-f指定了一个过滤规则。这里规则以-开头,表示是一个排除规则:排除所有以'.zip'结尾的文件。通配符的规则和shell中是一样的:*表示任意数量的任意字符。

这个命令执行的时候,rsync会递归查找src下的目录和子目录,当它碰到zip文件的时候,通过检查过滤规则,它就知道这个文件不应该被同步,因此会跳过。对于非zip文件,没有命中任何规则,默认是进行同步。

例子2: 只同步src目录下的zip文件

大家可能会认为只同步zip文件的话,一个-f '+ *zip'过滤器就够了。其实这是不行的,正确的做法如下:

rsync -r -f '+ *.zip' -f '+ */' -f '- *' src/ target/

这里连着指定了三个过滤器:

  1. + *.zip 指定要包含zip文件
  2. + */ 指定要包含所有子目录
  3. - * 指定不包括所有文件和目录

过滤器是按照指定的顺序被应用的。当一个过滤器满足条件后,后面的其他过滤器就跳过不看了。

所以当rsync遍历src目录的时候,如果发现一个zip文件,则第一个规则就命中了,因此zip文件会被同步,后面两个规则就不用看了。

如果遍历的时候碰到一个txt文件,则第一个规则不满足,就要看第二个规则。第二个规则是匹配目录的,因此第二个规则也不满足。然后就看第三个规则,第三个规则能匹配所有文件或目录。因此第三个规则满足,由于这是一个排除规则。所以txt文件被排除,不进行同步。

如果src下有子目录,遍历的时候碰到这个子目录,则第一条规则不命中,第二个规则命中,第三个规则不用看。此时子目录也会被同步并递归进入。

为什么只指定一个过滤器不行呢?

因为默认的规则是包含,一个txt文件没有命中+ *.zip过滤器,它会继续找后面的过滤器,后面如果没有其他过滤器,就会执行默认规则,默认规则是同步,所以它也会被同步。

因此需要追加一个规则,排除所有其他文件。但是这样又会排除所有子目录,因此还要再追加一个规则,允许所有子目录。这样才完整。