rsync --使用符号链接更新

Kev*_*vin 6 rsync symlink

这与这个问题相关,但我认为答案并不完全适用于此。

我有两台服务器,它们相互同步目录。这些目录包含文件和符号链接。在服务器B上,我使用以下命令从服务器A同步:rsync -auv A:dir/ dir/

我想要的: A上的任何文件或符号链接与B上的相应文件或符号链接不同且更新的文件或符号链接都会同步。

实际发生的情况: A上任何与B上的相应文件不同且更新的文件都会被同步。A上与B上相应符号链接不同的任何符号链接都会同步,无论时间戳如何

的手册页rsync有这个(强调我的):

-u,--更新

这会强制 rsync 跳过目标上存在且修改时间比源文件更新的任何文件。(如果现有目标文件的修改时间等于源文件的修改时间,并且大小不同,则它将被更新。)请注意,这不会影响符号链接或其他特殊文件的复制。

所以这是预期的行为。为什么是这样?有办法解决吗?或者,是否有一个替代解决方案来实现总体目标,即在服务器离线一段时间并丢失数据后使这些目录保持同步?

我的 rsync 版本是3.0.9.

示例:我设置了 2 个目录AdirBdir,每个目录包含一个文件和一个具有不同内容的符号链接:

$ ls -l Adir/ Bdir/
Adir/:
total 0
-rw-r--r-- 1 kevin kevin  5 May 27 18:00 file
lrwxrwxrwx 1 kevin kevin 10 May 27 18:00 symlink -> /some/file

Bdir/:
total 0
-rw-r--r-- 1 kevin kevin  6 May 27 17:00 file
lrwxrwxrwx 1 kevin kevin 16 May 27 17:00 symlink -> /some/other/file
Run Code Online (Sandbox Code Playgroud)

运行rsync --dry-run -auv Adir/ Bdir/输出如下:

sending incremental file list
./
file
symlink -> /some/file

sent 101 bytes  received 21 bytes  244.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)
Run Code Online (Sandbox Code Playgroud)

这正是我所期望的。它会复制(或者如果不是在空运行中的话)文件和符号链接,因为它们是较新的。但是运行rsync --dry-run -auv Bdir/ Adir/输出如下:

sending incremental file list
./
symlink -> /some/other/file

sent 104 bytes  received 18 bytes  244.00 bytes/sec
total size is 22  speedup is 0.18 (DRY RUN)
Run Code Online (Sandbox Code Playgroud)

即使比它Bdir/symlink更老,Adir/symlink它仍然会被同步。

meu*_*euh 1

一种解决方法可能是忽略 rsync 中的符号链接并单独执行它们,例如,tar可以要求不要覆盖较新的目标。例如

( cd Adir; find . -type l |
  tar cf - -T- 
) |
tar xvvf - --keep-newer-files -C Bdir
Run Code Online (Sandbox Code Playgroud)