我使用dry-run
(-n) 选项来rsync
比较两个不同系统上的目录。标准文件和目录一切正常。但是,当我使用包含符号链接的目录时,我收到错误:
> ls -l /usr/user1/server10s/system/
total 1
lrwxrwxrwx 1 localuser other 37 Jun 19 17:18 nrcalc -> /usr/user2/nrcalc10s
> rsync -n -avrc /usr/user1/server10s/* aisdba@Server:deployment_area/server
building file list ... done
system/
cannot delete non-empty directory: system/nrcalc
could not make way for new symlink: system/nrcalc
template/
template/nrcalc
sent 190 bytes received 24 bytes 38.91 bytes/sec
total size is 330 speedup is 1.54
rsync error: some files could not be transferred (code 23) at main.c(692)
我很高兴它无法删除该目录,因为我实际上并没有尝试更改任何内容,但为什么它还要尝试这样做呢?顺便说一句,我尝试添加-l
(链接)和-K
(复制链接)选项,但没有效果。
即使目录结构中存在符号链接,如何才能进行此比较?
答案1
正如您所示,system/nrcalc
是本地系统上的符号链接,但它是远程服务器上的目录。如果远程系统上的目录不为空,rsync 将拒绝删除它(为符号链接让路),除非您指定--force
或选项之一--delete
。如果您不想替换远端的目录,但仍需要使用本地符号链接指向的内容来更新它,则可以使用--copy-dirlinks
.
即使指定了 Rsync 也会抱怨这一点,--dry-run
以提醒您它需要删除远端的目录才能执行您要求它执行的操作。结合使用我提到的任何选项-n
都可以让您进行干净的试运行,而无需实际删除任何内容。
至于您尝试过的其他选项:
选项
-K
(--keep-dirlinks
) 等同于--copy-dirlinks
,但在目标端除外。您的符号链接位于源端,这就是为什么此选项对您没有影响。选项
-l
(--links
) 确保将符号链接复制为符号链接,但同样,如果没有--force
或--delete
,rsync 将拒绝用符号链接替换非空目录。另外,-a
暗示-l
,所以无论如何你一直在使用它。