如何使 rsync 從目標中刪除不在來源清單中的目錄

如何使 rsync 從目標中刪除不在來源清單中的目錄

我希望能夠將多個目錄中的檔案同步到一個目錄。如果我從來源清單中刪除目錄,那麼我希望從目標中刪除該目錄及其所有檔案。

這是一個快速範例:

mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3

dir3 現在包含「dir1/file1」和「dir2/file2」。

如果我再次 rsync,並從清單中刪除 dir2:

rsync -a dir1 dir3

然後我想從目標中刪除 dir2/file2 和 dir2 。

rsync 的 --delete 選項僅處理 dir1 和 dir3/dir1 之間的刪除,因此 dir2 保留(即使使用 --delete)。

我已經瀏覽了 rsync 手冊頁中的各種選項,但沒有看到任何選項告訴 rsync “組合”所有來源並將它們視為“一”樹,以便“--delete”執行我想要它做什麼。然而,我非常有信心我不是第一個想做這樣的事情的人。

有想法嗎?

答案1

如果您將多個來源目錄同步到一個目標目錄,則該--delete標誌顯然無法運作。您可以同步and的父目錄的內容,而不是同步dir1and 。dir2dir3dir1dir2

範例(使用 rsync 標誌-i檢視變更):

$ mkdir -p dir12/dir1 dir12/dir2 dir3
$ touch dir12/dir1/file1 dir12/dir2/file2
$ rsync -ai dir12/ dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
# BEFORE: dir1 and dir2 were synced to dir3
$ rm -rf dir12/dir2
$ rsync -ai --delete dir12/ dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./
# AFTER: dir3/dir2 is gone

如果您沒有公共父目錄,則dir12/dir2可能是指向真實目錄的符號連結。在第一次呼叫中使用選項-L( ),您將獲得與目錄相同的目錄結構(而不是符號連結)。刪除符號連結並再次與目錄同步後,就會像範例中一樣消失。--copy-linksrsyncdir3dir2dir12/dir2--deletedir3/dir2

編輯:

我擺弄了一下,可能發現了一個駭客:

$ mkdir empty dir1 dir2 dir3
$ touch dir1/file1 dir2/file2
$ rsync -ai dir1 dir2 dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
$ rsync -ai --delete empty/ dir1 dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./

用作empty/要刪除的所有目錄的佔位符。

相關內容