rsync --使用符号链接更新

rsync --使用符号链接更新

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

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

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

实际发生了什么:任何文件A该文件与上的相应文件不同且更新已同步。任何符号链接A这与相应的符号链接不同已同步,与时间戳无关

的手册页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

运行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)

这正是我所期望的。它会复制(或者如果不是在空运行中的话)文件和符号链接,因为它们是较新的。但是运行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)

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

答案1

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

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

相关内容