rsync 與路徑上的符號連結

rsync 與路徑上的符號連結

假設我們的目錄中有一條路徑,如下所示:

a/b/c/d/e

實際上c是一個符號鏈接,

a/b/c -> f

f包含d/e.

然後,當我運行時rsync -avzR,沒有--copy-unsafe-links標誌,它仍然會複製這個“不安全”連結。

預期的:

a/b/c->f
f/d/e

當我跑步時rsync -avzR a/b/c/d/e some_dir

實際輸出:

a/b/c/d/e

我怎樣才能以這種方式獲得預期的輸出?

答案1

man rsync(我的重點):

-R, --相對

使用相對路徑。這意味著命令列上指定的完整路徑名將發送到伺服器,而不僅僅是檔案名稱的最後部分。 [如果]你使用過

rsync -avR /foo/bar/baz.c remote:/tmp/

然後將在遠端電腦上建立一個名為 /tmp/foo/bar/baz.c 的文件,並保留其完整路徑。這些額外的路徑元素稱為“隱含目錄”(即上面範例中的“foo”和“foo/bar”目錄)。

從 rsync 3.0.0 開始,rsync 始終將這些隱含目錄作為檔案清單中的真實目錄傳送,即使路徑元素實際上是傳送端的符號連結。 這可以防止在複製您沒有意識到其路徑中有符號連結的檔案的完整路徑時出現一些真正意外的行為。如果要複製伺服器端符號鏈接,請透過其路徑包含符號鏈接,並透過其真實路徑包含引用目錄。如果您在傳送端處理較舊的 rsync,則可能需要使用該--no-implied-dirs選項。

因此,您所經歷的行為是預期的。

如何克服這個問題?我還沒有對此進行測試,但我認為可行的解決方法如下:

mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b  # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir   # No trailing slash after 'f'

我還建議閱讀符號連結手冊頁的部分rsync

答案2

我無法複製你的行為。我創建了一個腳本來設定目錄然後複製它。它內部有一個相對和一個絕對符號連結。使用您顯示的選項 ( -avzR),它不應下降到任一選項,而應將連結複製為連結。

我認為我誤解了您正在嘗試的某些方面。因此,如果您發現那是什麼,您可以將其添加到您的問題中,或者您可以運行此腳本並查看您的行為是否與我顯示的不同。

腳本:

#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST

輸出

sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f

目的地是用裡面的符號連結建立的

$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f

相關內容