rsync 调整具有到目标位置的绝对路径的链接

rsync 调整具有到目标位置的绝对路径的链接

是否可以使用 rsync 将绝对符号链接调整到目标的新位置?

测试用例
假设我有一个指向如下文件的链接:

/usera/files/common/test_file
/usera/files/common/links/test_link -> /usera/files/common/test_file

现在我想将整个目录 rsynccommon到另一个位置。(组权限已调整,请参阅下文原因)

rsync -av --no-g /usera/files/common/ /userb/common

这给了我:

/userb/common/test_file
/userb/common/links/test_link -> /usera/files/common/test_file

问题
问题在于目标上的组与源上的组不同(出于安全原因),因此test_link不指向/userb/空间而是指向/usera/,因此该用户无法读取。

问题
是否可以告诉 rsync 调整同步点(/common/此处)下方的链接以适应新目的地?这将提供如下链接:

/userb/common/links/test_link -> /userb/common/test_file

我尝试按照以下解决方案类似问题,但它似乎并没有实现我想要的效果。

谢谢!

答案1

Rsync 不支持这一点。可以对其进行修改以支持这一点,但 rsync 已经有太多选项了。您可以在 rsync 之后执行以下命令来实现您的目标:

find /tmp/userb -type l -ls |
awk '$13 ~ /^\/tmp\/usera/ { sub("/tmp/usera/files/", "/tmp/userb/", $13); print $11, $13 }' |
while read A B; do rm $A; ln -s $B $A; done

答案2

还允许在任一文件名中使用空格(因此使用“?”作为分隔符,这至少是 NTFS 文件系统中的禁用字符):

find /tmp/userb -type l -printf "%p?%l\n" |
awk -vFS="?" '$2 ~ /^\/tmp\/usera/ { sub("/tmp/usera/files/", "/tmp/userb/", $2); print $1 "?" $2 }' |
while IFS=? read A B; do rm "$A"; ln -s "$B" "$A"; done

相关内容