rsync 是一个经常被用来同步数据的命令,但是在使用过程中一个小细节比较容易被忽略,那就是路径结尾的 “/” ,在路径的结尾有没有反斜杠,命令结果是大不相同的。现在作个简单试验来说明:

      新建两个目录,一个名为sourceDir,另一个名为destinationDir,并分别在目录中建立两个不同的文件:

[root@localhost ~]# mkdir sourceDir
[root@localhost ~]# mkdir destinationDir
[root@localhost sourceDir]# touch a1 a2
[root@localhost destinationDir]# touch b1 b2

[root@localhost ~]# ls -l sourceDir/
total 0
-rw-r--r--  1 root root 0 Sep 18 12:39 a1
-rw-r--r--  1 root root 0 Sep 18 12:39 a2

[root@localhost ~]# ls -l destinationDir/
total 0
-rw-r--r--  1 root root 0 Sep 18 12:40 b1
-rw-r--r--  1 root root 0 Sep 18 12:40 b2

下面分别演示目录尾部是否带反斜杠的作用:

 [root@localhost ~]# rsync -a sourceDir destinationDir/

源目录未带尾部路径反斜杠,rsync 会把 sourceDir 整个目录复制到 destinationDir 中,结果如下:

[root@localhost ~]# ls -l sourceDir/
total 0
-rw-r--r--  1 root root 0 Sep 18 12:39 a1
-rw-r--r--  1 root root 0 Sep 18 12:39 a2
[root@localhost ~]# ls -l destinationDir/
total 4
-rw-r--r--  1 root root    0 Sep 18 12:40 b1
-rw-r--r--  1 root root    0 Sep 18 12:40 b2
drwxr-xr-x  2 root root 4096 Sep 18 12:39 sourceDir 

源目录带尾部路径反斜杠,rsync 会把 sourceDir 目录内的内容全部复制到 destinationDir 中,结果如下:

[root@localhost ~]# rsync -a sourceDir/ destinationDir/
[root@localhost ~]# ls -l sourceDir/
total 0
-rw-r--r--  1 root root 0 Sep 18 12:39 a1
-rw-r--r--  1 root root 0 Sep 18 12:39 a2
[root@localhost ~]# ls -l destinationDir/
total 0
-rw-r--r--  1 root root 0 Sep 18 12:39 a1
-rw-r--r--  1 root root 0 Sep 18 12:39 a2
-rw-r--r--  1 root root 0 Sep 18 12:40 b1
-rw-r--r--  1 root root 0 Sep 18 12:40 b2 

看到了目录尾部是否带路径反斜杠的区别了吗?

简单总结一下:源目录尾部的路径反斜杠是告诉 rsync 复制这个目录里的所有内容到目标目录 ,如果不加目录尾部路径反斜杠,那么这个目录本身会被复制到目标目录中。

我们一般都是想要把源目录的内容同步到目标目录中,所以如果你实在记不清这个区别,那么在源目录的最后加上 “/*” 是最保险的方法。