我有一個要使用 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
) 中有更多詳細資訊。