Contents

rsync命令同步隐藏文件

1. 概述

在本教程中,我们将讨论将数据从一个目录移动到另一个目录时必须牢记的事项,其中一个有用的工具是*rsync *命令。

例如,一个典型的用例是当我们开发一个从开发到实时系统的网站时。

2. rsync点文件的问题

让我们假设一个典型的场景。我们有两个包含 Web 内容的文件夹。一是发展路径。另一个是生产路径:

$ ls -las
total 16
4 drwxrwxr-x  4 tracer tracer 4096 Feb 28 13:05 .
4 drwxr-xr-x 39 tracer tracer 4096 Feb 28 13:11 ..
4 drwxrwxr-x  2 tracer tracer 4096 Feb 28 12:57 dev
4 drwxrwxr-x  2 tracer tracer 4096 Feb 28 13:05 prod

我们开发环境的内容:

$ ls -las dev
total 8
4 drwxrwxr-x 2 tracer tracer 4096 Feb 28 12:57 .
4 drwxrwxr-x 4 tracer tracer 4096 Feb 28 13:05 ..
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 12:57 .htaccess
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 12:57 index.html

当我们尝试以这种方式使用rsync命令时,它会给我们一个意想不到的结果:

$ rsync -av dev/* prod
sending incremental file list
index.html

如我们所见,rsync省略了 .htaccess 文件,或者至少看起来是这样。

3.解决方案

当我们省略星号并再次运行命令时:

rsync -av dev/ prod
sending incremental file list
./
.htaccess
index.html

我们可以看到连隐藏文件 .htacces也被复制了。

4. 说明

在这种情况下,我们的问题与 shell 的工作方式有关。有一种称为globbing 的机制,它在实际调用rsync程序之前将星号扩展为文件名。

假设我们还有几个文件:

ls -las dev
total 8
4 drwxrwxr-x 2 tracer tracer 4096 Feb 28 13:22 .
4 drwxrwxr-x 4 tracer tracer 4096 Feb 28 13:05 ..
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 12:57 .htaccess
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 13:22 about.html
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 13:22 home.html
0 -rw-rw-r-- 1 tracer tracer    0 Feb 28 12:57 index.html

让我们发出命令:

rsync -av dev/* prod

在将目录发送到rsync命令之前,shell 会展开目录中的内容。实际上,调用看起来像这样:

rsync -av about.html home.html index.html prod

因此,shell 的 globbing 会忽略点文件,也称为隐藏文件。如果我们只是将目录本身添加为参数,则不会发生通配,rsync甚至会复制点文件。