这与这个问题但我认为答案并不完全适用于此。
我有两台服务器,它们相互同步目录。这些目录包含文件和符号链接。在服务器上乙,我从服务器同步A用这个命令:rsync -auv A:dir/ dir/
我想要的是:任何文件或符号链接A与相应的文件或符号链接不同且更新乙已同步。
实际发生了什么:任何文件A该文件与上的相应文件不同且更新乙已同步。任何符号链接A这与相应的符号链接不同乙已同步,与时间戳无关。
的手册页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
运行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