rsync 抱怨符号链接

roj*_*oke 8 rsync symlink

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

我很高兴它不能删除目录,因为我实际上并没有试图改变任何东西,但为什么它甚至试图改变?顺便说一句,我已经尝试添加-l(链接)和-K(复制链接)选项,但没有效果。

即使使用目录结构中的符号链接,我如何才能使这种比较起作用?

Jam*_*ger 8

如您所示,system/nrcalc是本地系统上的符号链接,但它是远程服务器上的目录。如果远程系统上的目录不为空,除非您指定--force--delete选项之一,否则 rsync 将拒绝删除它(为符号链接让路)。如果您不想替换远端的目录,但仍需要使用本地符号链接指向的内容更新它,则可以使用--copy-dirlinks.

Rsync 抱怨这一点,即使--dry-run指定提醒您它需要删除远端的目录才能执行您要求它执行的操作。使用我提到的任何选项-n都将为您提供干净的试运行,而无需实际删除任何内容。

至于您尝试的其他选项:

  • -K选项(--keep-dirlinks)是相当于--copy-dirlinks,除了在目的地侧。您的符号链接位于源端,这就是此选项对您无效的原因。

  • -l选项(--links)确保符号链接复制为符号链接,但同样,没有--force--delete,rsync的会拒绝与一个符号来代替一个非空目录。此外,-a意味着-l,所以无论如何你一直在使用它。