2013-05-28 58 views
4

我想製作一個腳本來備份我的家和其他重要的目錄到外部驅動器,同時排除某些目錄和文件類型(--exclude)。排除文件需要在備份上刪除,以防將文件類型或目錄添加到排除列表(--delete-excluded)。我怎樣才能防止在rsync中刪除一個目錄

此外,所有刪除的內容都需要備份,以防萬一出現可怕的錯誤(--backup --backup-dir=rsync/backup)。

我開始了這一點:

#!/usr/bin/env bash 

PATH_PWD="`pwd`" 
PATH_HOME=~ 
SRC="/home/redsandro" 
PATH_TARGET="/media/redsandro/MyBook 4TB/backup/`hostname`" 
PATH_BIN="${SRC}/bin" 
EXCL_FROM="${PATH_BIN}/rs-backup-external.sh.exclude.txt" 
DATE="`date +%Y-%m-%d`" 

OPTS="-ahl --update --del --delete-excluded --force --ignore-errors --progress --stats --exclude-from=$EXCL_FROM --log-file=~/rsync/rsync.$DATE.log" 
OPTS="$OPTS --backup --backup-dir=rsync/backup/${DATE}" 
#OPTS="$OPTS --dry-run" 

echo Backing up $SRC to $PATH_TARGET... 
echo 
sudo rsync $OPTS "$SRC/" "${PATH_TARGET}${SRC}" 

現在,很明顯,--del衝突與--backup --backup-dir=rsync/backup。我可以排除這個目錄被刪除嗎?或者也許有更簡單的方法來做到這一點?

我的目標是讓腳本可以在我的所有機器上運行,其中一部分同步到計算機特定的目錄,另一部分(文檔,圖片)同步到全局目錄,因爲它們都需要無論如何。

+0

你有沒有解決這個問題?我不清楚你在做什麼 - 備份的備份? – philshem

+0

不,我從來沒有。我試圖定期進行鏡像備份,但也會將備份中將要刪除的所有文件移動到特定的目錄中,以便我可以撤消偶然刪除的任何內容。 – Redsandro

+0

也許可以考慮使用rsync的-n或--dry-run選項來查看它會執行什麼操作,然後複製在rsync的實際運行中將被刪除的數據? – GL2014

回答

2

Rsync是一個了不起的工具,但有時很難使用。

問題是您正在使用--exclude-from,它將全局排除規則設置爲發送方和接收方。

在rsync對文件系統執行操作之前,它將首先彙編兩個文件列表,一個用於發送端(客戶端),另一個用於接收端(服務器)。如果從兩側排除文件,rsync將簡單地忽略它。如果它僅從發送端被排除並存在於接收端,則rsync將刪除它。

在你的情況,由於你的規則是從雙方排除文件,rsync不會刪除它們。然後您使用--delete-excluded強制刪除。但是,就像你說的,這個選項與--backup --backup-dir=rsync/backup衝突。

我建議你做以下幾點。

  1. $EXCL_FROM轉換爲正常的過濾器文件,即在每行之前插入負號以使它們排除規則。
  2. 從rsync選項中刪除--exclude-from=$EXCL_FROM--delete-excluded
  3. 在rsync選項中包含-FF
  4. 在調用rsync之前包含以下命令。

    cp "$EXCL_FROM" "$SRC/.rsync-filter" 
    

這樣一來,您的規則將只適用於在發送端,並指定爲排除規則文件將從接收方一旦發現被刪除。這不應與備份選項衝突。

更新

從本質上講,-FF選項讓rsync的過程中每個目錄在轉會兩側命名.rysnc-filter過濾文件。在你的情況下,它只會在發送端存在,所以它的規則不適用於接收端。其實-FF等於-F -F。第一個F告訴rsync在源目錄和目的目錄的根目錄中合併來自.rsync-filter的規則,就像我之前說過的那樣。第二個F告訴rsync排除它們。您不希望.rsync-filter被轉移,否則您的排除規則也適用於接收方,並且您的原始問題將返回 - 排除的文件將不再被刪除。

這裏就是我的man (1) rsync說:

-F same as --filter='dir-merge /.rsync-filter' 
     repeated: --filter='- .rsync-filter' 
+0

我的'man'文件沒有提及'-FF',這是什麼意思? – Redsandro

+0

我更新了答案,並澄清了關於'-FF'。隨意問清楚是否不清楚。 – Rafa

+0

謝謝。我已經添加了一個列表格式彙總(等待同行評議)並接受了您的答案。 – Redsandro

相關問題