
我希望能夠將多個目錄中的檔案同步到一個目錄。如果我從來源清單中刪除目錄,那麼我希望從目標中刪除該目錄及其所有檔案。
這是一個快速範例:
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的父目錄的內容,而不是同步dir1
and 。dir2
dir3
dir1
dir2
範例(使用 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-links
rsync
dir3
dir2
dir12/dir2
--delete
dir3/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/
要刪除的所有目錄的佔位符。