rsync 调用来替换指向源的符号链接?

rsync 调用来替换指向源的符号链接?

目前,我正在将一个大文件系统移动到新服务器,因为原始文件服务器不再能够处理文件系统写入。

为了快速完成此操作,我在目标文件系统上创建了指向原始文件系统的符号链接。

最初:/company/release (原始文件系统的挂载点)

迁移后:/company/release.old (自动挂载映射更新后指向原始文件系统)/company/release (自动挂载映射更新后指向新的文件服务器/文件系统)

在 /company/release 中有如下符号链接: /company/release/product-1.0.tar.gz -> /company/release.old/product-1.0.tar.gz /company/release/product-1.0 -> /company/release.old/product-1.0 (这是一个文件树)

使用符号链接可以让我快速将写入内容移至新文件系统。现在我想慢慢将现有文件和目录迁移到新文件系统。

我遇到的问题是,由于符号链接指向原始文件,rsync 没有看到任何差异,所以它实际上并没有复制文件或目录并删除/覆盖符号链接。

是否有一组 rsync 标志可以完成我想要的操作?

答案1

来自手册页:

        -L, --copy-links            transform symlink into referent file/dir

答案2

-a参数将执行您想要的操作,复制符号链接(以及其它内容),因此目标将是源的“档案副本”。

注意:-a的标志cp看起来很像 rsync-a标志(因为它保留了所有的属性、日期和时间),在复制之前不会删除目标,因此它会通过任何现有的符号链接复制到它们指向的任何位置。

示例:*文件abc其中分别包含字符串“one”,“two”和“three”,则符号链接aa指向a.*

使用cp -a c aa,您最终会在 中得到“three”,这似乎确实是错误的,直到您意识到他们正在执行 POSX,这意味着最低公分母。

使用rsync -a c aa,符号链接aa将被替换为包含“three”的文件,并且文件a保持未损坏。

答案3

使用 --ignore-times (-I) 以便 rsync 始终进行复制。Rsync 应该将目标与源进行比较并优化复制。不幸的是,没有 --replace-reflective-symbolic-links 选项。Rsync 始终将指向源的链接视为具有与源相同的内容。

我发现解决此问题的唯一方法是使用find . -type l -exec bash -c '{ z=$(readlink -e "{}"); [[ "$z" ]] && cp -av --remove-destination "$z" "{}"; };' \;您可能需要调整以满足您的需求的方法。

相关内容