Rsync
rsync 以適應具有到目的地位置的絕對路徑的連結
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