題 rsync刪除選項有什麼區別?


我看到了 rsync手冊頁 有一些 delete 選項,但不是真正理解它們之間的差異。這些選項有什麼區別?

 --del                   an alias for --delete-during
 --delete                delete extraneous files from dest dirs
 --delete-before         receiver deletes before transfer (default)
 --delete-during         receiver deletes during xfer, not before
 --delete-delay          find deletions during, delete after
 --delete-after          receiver deletes after transfer, not before
 --delete-excluded       also delete excluded files from dest dirs

101
2018-06-25 12:29


起源


為什麼 --delete-before 被描述為 (default)?我無法理解 (default) 手段。 - Marco Marsala
它不再被指定為默認值 man 的頁面 rsync version 3.1.2 protocol version 31。但是,我對帶引號文本的版本的猜測是,如果你只使用 --delete 而不是 --delete-WHEN,那就好像你指定的那樣 --delete-WHEN 哪裡 WHEN 默認為 before。 - Tom Hale


答案:


  • --del/--delete_during:複製時從目標目錄中刪除文件(與...相比節省內存) --delete-before--delete-before 進行單獨掃描以查找可刪除的內容)

  • --delete:如果源目錄中不存在目標目錄中的文件,則刪除這些文件。

  • --delete-before:在從源目錄複製帶有相同名稱的文件之前,刪除目標目錄中的文件

  • --delete-during:刪除目標目錄中的文件WHILE從源目錄複製具有相同名稱的文件

  • --delete-delay:標記在傳輸過程中刪除,但請等到傳輸完成

  • --delete-after:Receiver在傳輸之後刪除,而不是之前...如果rsync的其他部分將其他文件移動到其他位置,則需要此而不是 --delete-delay因為 --delete-delay 決定在轉移過程中刪除它的內容,而 --delete-after 檢查目錄中是否有任何內容完成後應刪除的文件。

  • --delete-excluded:從目標目錄中刪除明確排除從源目錄傳輸的文件。

rsync的重點不是複制,而是歸檔。這是一個重要的區別。處理已刪除/已更改的文件至關重要,並且在許多情況下會有細微差別。

--delete 國旗特別是我見過很多次搞砸了。很多人使用rsync將文件移動到低優先級存儲,在這種情況下,您希望移動到的文件仍然存在於目標目錄中。這不是刪除的作用: --delete 確保從源目錄中刪除文件時,它也會從目標目錄中刪除,因此您的目標不會充滿垃圾......一旦看到一個人通過放入新驅動器消滅他的備份,而不是關閉他的夜間rsync腳本。腳本看到源目錄現在為空,它刪除了目標目錄中的每個文件,因此它們匹配。

大多數其他選項都與空間或性能相關。刪除文件很重要,如果你想在做任何事情之前確保轉移成功,但如果你的設備太小而無法處理所有信息的2份副本,你需要隨時刪除,等等。這是一個由於其在多個平台上的悠久歷史,有點古怪:添加了一些選項,以便習慣於某些行為的人不會感到困惑。


101
2018-06-25 14:19



那麼--delete和--delete - 之前是一樣的嗎? man rsync沒有說--delete何時刪除文件。 - ppr
@ppr:取決於系統。它有這麼多特定選項的原因是因為Solaris上的刪除!= HP-UX上的刪除!= AIX上的刪除!= Linux上的刪除。 - Satanicpuppy
當rsyncing整個目錄時,確實如此 delete-after 在同步之間刪除每個文件,還是僅在整個目錄鏡像之後刪除?我想 delete-after 足以滿足我的需求,但在備份其中一個驅動器時,我在設備上沒有剩餘空間。 - Sridhar-Sarnobat
@Sridhar-Sarnobat:要么。它會移動它要移動的所有東西,當它完成後,它就會開始刪除東西。如果您希望在移動所有內容之前將其刪除,請使用--delete-during - Satanicpuppy
經過一些經驗,我發現它甚至 delete-during 並不總是阻止 no space left on device (在Linux上)。所以 delete-before 是避免它的唯一保證方式(例如鏡像幾乎已滿的驅動器,目標驅動器幾乎已滿)。 - Sridhar-Sarnobat


有兩件事情在發生:

  1. 誰刪除
  2. 當它發生時

可以指示發送者或接收者進行刪除(我不確定為什麼這很重要)。因此,當來自一台計算機的rsync連接到另一側的rsync服務器時,這將確定誰正在有效地發出刪除命令。

當它發生時很容易......之前意味著刪除所有文件,然後rsync複製文件。在通過文件列表的過程中,它會在它們出現時刪除它們,之後它會等到所有文件都被轉移然後刪除遠程端。這僅在傳輸中斷時才有意義。


1
2018-06-25 12:57



我很確定這些選項都與從中刪除內容無關 發件人 側。所有這些(AFAIK)都涉及從中刪除內容 接收器的 側。另外,你說:“之前意味著刪除所有文件,然後rsync複製文件” - 這是對的嗎?我期待 --delete-before 只刪除那些需要消失的文件,而不是 所有 文件!但我想是的 可能 rsync刪除所有內容,然後通過“新”(可能未更改的)數據進行傳輸... - Quuxplusone
啊,“從發件人那邊刪除” 是 rsync支持,但該選項的名稱是 --remove-source-files。 - Quuxplusone


值得一提的另一點是,如果源目錄以。結尾 /*那麼rsync只會考慮 那些 文件而不是目錄本身(因此缺少要在目標上刪除的文件)。

如果你在上面指定了一個刪除選項,但是rsync看起來沒有刪除,那麼請檢查以確保你沒有意外地使用文件列表並提供文件列表。


1
2018-01-17 18:50