我想同步多個來源,我想知道實現這一目標的最佳方法。
例如
/etc/fstab
/home/user/download
我想到了 3 個解決方案:
- 解決方案1
多次調用 rsync
rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp
缺點:更難取得聚合統計數據
- 解決方案2
建立一個tobackup
包含符號連結的資料夾,並使用-L
選項
sync -aL /home/user/tobackup bkp
缺點:要備份的內容不得包含符號鏈接
- 解決方案3
將檔案移至備份並在原始位置建立符號鏈接
rsync -a /home/user/tobackup bkp
缺點:一些手動配置
您推薦哪一款?
有沒有更好的辦法 ?
答案1
您可以傳遞多個來源參數。
rsync -a /etc/fstab /home/user/download bkp
這會創建bkp/fstab
和bkp/download
,就像您給出的單獨命令一樣。相反,可能需要保留源結構。為此,請使用/
作為來源並使用包含-排除規則指定要複製的文件。有兩種方法可以做到這一點:
當您想要複製整個目錄樹時,明確包含每個檔案以及通往該檔案的每個目錄元件,並
/***
在目錄末尾新增:rsync -a \ --include=/etc --include=/etc/fstab \ --include=/home --include=/home/user --include='/home/user/download/***' \ --exclude='*' / bkp
/*/
使用(以便 rsync 在尋找要複製的檔案時遍歷/etc
)包含所有頂級目錄,使用(for )/home
包含所有二級目錄,但刪除不複製任何檔案的目錄。這更方便,因為您不必明確列出父母。您甚至可以使用而不是計算等級數,但這在這裡是不切實際的,因為 rsync 會遍歷整個檔案系統來探索目錄,即使沒有任何包含規則可以匹配和之外的任何內容。/*/*/
/home/user
--prune-empty-dirs --include='*/'
/etc
/home/user/download
rsync -a --prune-empty-dirs \ --include='/*/' --include='/*/*/' \ --include=/etc/fstab \ --include='/home/user/download/***' \ --exclude='*' / bkp
答案2
我真的很喜歡吉爾斯的回答,但是,我想補充一點,在我看來,透過與該--relative
選項結合傳遞多個來源參數,可以最好地滿足在保留目錄結構的同時同步多個資料夾的要求。
在這種情況下,我們可以有以下內容:
rsync -aR /etc/fstab /home/user/download bkp
這將導致bkp/etc/fstab
和bkp/home/user/download
。
最好的部分是(我相信從 rsync v.2.6.7 開始)我們可以本質上控制我們想要在目的地複製多少目錄結構。 (請參閱有關選項
的文檔--relative
這裡)
例如,如果我們這樣做
rsync -aR /home/./user1/download /home/./user2/download bkp
我們最終會得到bkp/user1/download
和bkp/user2/download
。
答案3
這也有效 - 大括號,包含逗號分隔的來源清單。
rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive
與您使用 cp 和某些其他實用程式呼叫大括號 sytnax 時發生的情況有些相似:
cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive