是否可以使用 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