rsync 的 --link-dest 選項由於文件時間原因未鏈接

rsync 的 --link-dest 選項由於文件時間原因未鏈接

考慮這個測試案例:

mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test

rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

如預期的那樣,rsync 創建了c/test一個硬連結b/test(注意 的引用計數2):

# ls -l c/test
-rw-r--r-- 2 root root 16 Jan  6 19:43 test

現在看這個:

rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

未建立硬連結:

# ls -l c/test
-rw-r--r-- 1 root root 16 Jan  6 19:50 test

線上說明頁說(強調我的):

所有文件必須相同保留屬性(例如權限,可能的所有權)以便將檔案連結在一起。

但是,我認為預設情況下文件時間不是保留因此在這裡應該沒有差別。

怎麼了?這是一個錯誤嗎?我能做些什麼?

我的目標是透過硬連結所有相同的檔案來節省託管儲存庫的許多分支的持續整合伺服器上的空間。所以我的實際命令是:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123
這意味著我不關心時間,所以我考慮touch將它們全部轉至當前時間,但這rsync將是一個某種程度上粗略的解決方案,而且觸控似乎不能遞歸工作。

答案1

您正在看到 rsync 的「快速檢查」演算法的結果,該演算法根據檔案的大小和時間戳記決定傳輸檔案。詳細資訊如下man rsync

Rsync 使用「快速檢查」演算法(預設)來尋找需要傳輸的文件,該演算法會尋找大小或上次修改時間已更改的文件。當快速檢查顯示檔案的資料不需要更新時,將直接在目標檔案上對其他保留的屬性(根據選項的請求)進行任何變更。

你有選擇:

  • 如果您希望忽略時間戳記並僅根據更改後的大小傳輸文件,則可以使用該--size-only選項。

    請注意,這意味著rsync如果更改恰好使檔案大小相同,則不會傳輸更改的檔案。

  • 如果您想rsync檢查文件的內容是否實際上相同,請使用--checksum.這可能會導致速度大幅減慢。

「快速檢查」演算法是預設演算法,因為它通常是速度和準確性之間的良好折衷。

相關內容