使用 rsync 只複製特定的符號連結?

使用 rsync 只複製特定的符號連結?

我有一個要使用 rsync 複製的資料夾結構,其中結構是一系列備份,我只想從中複製最新的備份(可以使用符號連結進行識別),如下所示:

/backups
    /foo
        /2019-05-01
        /2019-06-01
        /latest -> 2019-06-01
    /bar
        /2019-05-20
        /2019-06-20
        /latest -> 2019-06-20

等等;我想做的是,使用單一 rsync 指令,複製僅有的每個資料夾的備份latest,同時模仿結構。為此,我想出了以下命令:

rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path

--copy-links基本上是一個帶有一些包含/排除技巧的存檔,用於僅選擇/*/*/latest分支(加上-m避免一堆空目錄結構)。除了一個問題之外,這一切都很好;如果這些分支中的任何一個包含符號鏈接,那麼它們也會被複製為目標,而不僅僅是簡單的符號鏈接。

我真正需要做的是僅有的使用--copy-links帶有符號連結的行為,同時對遇到的任何其他latest行為使用另一種行為(例如 的行為)。--links

使用單一 rsync 指令可以實現這樣的事情嗎?我的目標是能夠運行它,而不必知道其直接內容是什麼/backups,這樣,如果我添加任何新內容(例如- /backups/baz),那麼它會自動複製。

更新:為了澄清,我希望在目標上看到的結果目錄結構是:

/backups
    /foo
        /latest
    /bar
        /latest

即-我只需要目標上每個備份的最新版本(目標本身將以另一種方式處理備份歷史記錄)。

答案1

這似乎符合您的要求

rsync -avR user@remote:'/backups/*/latest/' /some/local/path/

-R標誌有效地將整個來源路徑「複製」到目標中,生成的備份將作為/some/local/path/backups/{whatever}/latest.

如果您發現不需要整個來源路徑,則可以包含該/./路徑以指示應將路徑複製到目標的點。例如,/backups/./foo/latest/將導致/some/local/path/foo/latest/(即該/backups組件已被跳過)。文件 ( man rsync) 中有更多詳細資訊。

相關內容