Rsync

rsync 以適應具有到目的地位置的絕對路徑的連結

  • June 27, 2020

rsync 是否可以將絕對符號連結調整到目的地的新位置?

測試案例

假設我有一個指向這樣的文件的連結:

/usera/files/common/test_file

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

現在我想將整個目錄同步common到另一個位置。(組權限已調整,看下面為什麼)

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

我嘗試按照類似問題的解決方案,但它似乎沒有做我想要的..

謝謝!

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

還允許在任一文件名中使用空格(因此使用“?”作為分隔符,這至少是 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

引用自:https://serverfault.com/questions/351963