rsync指令備份主目錄和某些目錄中的檔案並刪除

rsync指令備份主目錄和某些目錄中的檔案並刪除

我嘗試準備 rsync 命令,該命令將: 1. 備份目錄中的所有文件,但不備份嵌套文件 2. 備份某些目錄 3. 當在來源中刪除文件時,刪除目標目錄中的文件

rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/

但這僅複製文件,不複製任何資料夾,也不刪除。你能幫我改進一下命令嗎?

答案1

嚴格來說,以下可以解釋為矛盾的目標。

  1. 備份目錄下的所有文件但不是嵌套文件即——排除='*/'
  2. 備份某些目錄 - 即包括一些嵌套文件

請參閱下面的解釋,了解為什麼您的論點沒有按照您的預期發揮作用。下面,請參閱可能適合您目的的合適替代方案(它符合#1、#3 和#2 的版本)。

為什麼你的命令不起作用:

rsync 處理命令列參數的方式,以下參數相當於說 --exclude='*/'

--排除='/'--include='所需的子資料夾/'

即,您的命令排除了所有嵌套文件,從而也排除了所需子資料夾中的文件。

此問題會影響您的第二個觀察結果,即在來源中刪除的目標中的檔案不會被刪除。實際上,您的命令在刪除頂層此類文件方面效果非常好。但是,下一層的檔案不會被刪除,因為它們已被排除。記住 --delete 指的是 --delete-during,而不是 --delete-before。

滿足 #1、#3 和 #2 版本的解決方案: 以下解決方案可能適合您的需求

rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/

它符合以下條件: 1. 備份深度為 1 的所有檔案和目錄,但不備份巢狀檔案。 2. 備份所需資料夾 3. 刪除目標中來源中沒有的檔案。

另一個比較麻煩的選擇如下

  rsync -vlptgoDd --delete src/ dest/

這滿足#1 和#3,但避免所有嵌套檔案(請記住,資料夾也是 *nix 中的檔案)。我避免給出 -r 選項,因此它不是遞歸的。刪除作品並複製深度為 1 的資料夾。除了保留時間戳記 (-t) 之外,我還包含了用於存檔複製的其他典型選項。

在不同資料夾中取得不同 rsync 行為的更標準方法是透過層次結構以每個目錄的方式散佈過濾規則;即建立特定於需要獨特行為的每個資料夾的 .rsync-filter 檔案。例如

   rsync -avF src/ dest/

相關內容