使用 rsync 維護名稱變更的目錄副本

使用 rsync 維護名稱變更的目錄副本

我在 Linux 系統上使用 rsync 來同步本機磁碟和連接的 USB 磁碟機之間的目錄。我遇到的問題是,每天在伺服器上建立備份的第三方系統實際上會更改嵌套在備份深處的目錄的名稱。該目錄包含備份所需的大部分資料。當 rsync 查看該目錄時,它發現名稱已更改並認為它是一個全新的目錄。因此,我的 USB 隨身碟上的 rsync 副本每天運行時都會有一個新目錄。

我已經編寫了實際上可以將目錄名稱更改回來的腳本,但這是一種麻煩的方法!

我正在尋找一種“優雅”的方式來處理這個問題。是否可以建立一個指向保持不變的目錄的連結? rsync 是否可以設定為偵測目錄是否相同,即使名稱已變更?我確信以前有人必須處理過這個問題!

答案1

一種方法是分兩步驟進行。 1,使用忽略模式 rsync 除相關目錄之外的所有內容。 2、rsync 只是在 bash 中使用 globbing 來存取該目錄,如下所示:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

在來源目錄上使用尾部斜線將有效地導致 rsync 忽略目錄名稱,因為它將在內容目錄而不是目錄本身。當然,如果目錄使用常數前綴或後綴命名,如上面的範例所示,則這種通配將是最簡單的。如果不是,您可以編寫腳本來找出目錄的實際名稱,並執行更直接的操作,如下所示:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

最後,你的偽代碼將是這樣的:

  1. 尋找 $BIGDATADIRNAME
  2. 像以前一樣 Rsync 所有內容,但忽略 $BIGDATADIRNAME
  3. 同步內容$BIGDATADIRNAME 的

答案2

您也許可以使用 rsync 選項--compare-dest=DIR,--copy-dest=目錄, 或者--link-dest=目錄。它們允許您在接收端指定一個附加目錄來尋找遺失的檔案。

例如,使用 --link-dest,rsync 將建立新版本的目錄,其中包含已更改的檔案的新副本,或未更改的檔案的硬連結副本。

要使用這些選項中的任何一個,您必須從先前的 rsync 運行中知道 USB 磁碟機上的目錄名稱,因此您可能需要將 rsync 包裝在腳本中,該腳本首先找出正確的目錄名稱。

您可能還想在建立新版本後使用 --delete-after 刪除舊版本的目錄。

答案3

僅靠 rsync 無法完成您想要的操作,因為 rsync 唯一可用的元資料是目錄名稱和 MACtimes。

在 rsync 內部自動處理它的唯一方法是讓 rsync 以某種方式擁有更多元資料。例如,Windows 上的 Microsoft DFS 複製會透過使用指派給 NTFS 磁碟區中檔案的唯一 ID 來擷取檔案(或目錄)名稱變更來處理此問題。

你的不優雅的腳本可能是做你想做的事情的最簡單的方法,無需轉儲 rsync 並尋找另一個工具。

使用符號連結不起作用,因為連接點與目標目錄的名稱相關聯(在這種情況下,目標目錄名稱將會變更)。您可以使用硬連結(與 inode 綁定),但您需要確保目錄名稱正在更改,而不僅僅是刪除並重新建立(這將為其分配不同的 inode)。

相關內容