簡體   English   中英

如何防止在rsync中刪除目錄

[英]How can I prevent a directory from being removed in rsync

我正在嘗試制作一個腳本,用於將我的主目錄和其他重要目錄備份到外部驅動器,同時排除某些目錄和文件類型( --exclude )。 如果我將文件類型或目錄添加到排除列表( --delete-excluded ),則也需要在備份上刪除排除的文件。

另外,刪除的所有內容也都需要備份,以防萬一出現嚴重錯誤( --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沖突。 我可以排除此目錄嗎? 還是有更簡單的方法可以做到這一點?

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

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

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

在rsync對文件系統執行操作之前,它將首先組裝兩個文件列表,一個用於發送方(客戶端),另一個用於接收方(服務器)。 如果文件從兩面都排除在外,則rsync只會忽略它。 如果僅從發送方排除它並且在接收方存在它,則rsync會將其刪除。

在您的情況下,由於您的規則從兩側都排除了文件,因此rsync不會刪除它們。 然后,使用--delete-excluded強制刪除。 但是,就像您說的那樣,此選項與--backup --backup-dir=rsync/backup沖突。

我建議您執行以下操作。

  1. $EXCL_FROM轉換$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'

一種替代方法是使用絕對路徑(由../指定)在備份文件夾之外找到--backup-dir

即。 --backup-dir="../rsync/backup/${DATE}"

這將在與目標文件夾相同的級別上創建一個新文件夾。 例如,如果您要導出到/home/user/rsync/backup則上述命令會將已刪除的文件存儲在home/user/rsync/rsync/backup/${DATE}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM