这与这个问题相关,但我认为答案并不完全适用于此。
我有两台服务器,它们相互同步目录。这些目录包含文件和符号链接。在服务器B上,我使用以下命令从服务器A同步:rsync -auv A:dir/ dir/
我想要的: A上的任何文件或符号链接与B上的相应文件或符号链接不同且更新的文件或符号链接都会同步。
实际发生的情况: A上任何与B上的相应文件不同且更新的文件都会被同步。A上与B上相应符号链接不同的任何符号链接都会同步,无论时间戳如何。
的手册页rsync
有这个(强调我的):
-u,--更新
这会强制 rsync 跳过目标上存在且修改时间比源文件更新的任何文件。(如果现有目标文件的修改时间等于源文件的修改时间,并且大小不同,则它将被更新。)请注意,这不会影响符号链接或其他特殊文件的复制。
所以这是预期的行为。为什么是这样?有办法解决吗?或者,是否有一个替代解决方案来实现总体目标,即在服务器离线一段时间并丢失数据后使这些目录保持同步?
我的 rsync 版本是3.0.9
.
示例:我设置了 2 个目录Adir
和Bdir
,每个目录包含一个文件和一个具有不同内容的符号链接:
$ 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
它仍然会被同步。
一种解决方法可能是忽略 rsync 中的符号链接并单独执行它们,例如,tar
可以要求不要覆盖较新的目标。例如
( cd Adir; find . -type l |
tar cf - -T-
) |
tar xvvf - --keep-newer-files -C Bdir
Run Code Online (Sandbox Code Playgroud)