2016-09-08 30 views
2

我想將「sdir」目錄根據當天的情況複製(rsync)到tdir目錄。我想要一個完整的副本到mon目錄,只改變了什麼,只改變了什麼,等等,但我沒有得到我需要的結果。 參考實際的命令我跑:Rsync備份一個源目錄,並再次檢查多個目錄

[[email protected] test]$ tree 
. 
├── sdir 
│ ├── file1 
│ ├── file2 
│ ├── file3 
│ ├── file4 
│ └── file5 
└── tdir 
    ├── fri 
    ├── mon 
    │ ├── file1 
    │ └── file2 
    ├── thu 
    ├── tue 
    │ └── file3 
    └── wed 
     ├── file3 
     ├── file4 
     └── file5 

7 directories, 11 files 
[[email protected] test]$ touch sdir/file6 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir//thu/ --backup-dir=/home/jesse/test/tdir/fri/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir//thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file6 

sent 208 bytes received 22 bytes 460.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av --dry-run sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir/thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 294 bytes received 31 bytes 650.00 bytes/sec 
total size is 0 speedup is 0.00 (DRY RUN) 
[[email protected] test]$ rsync -av sdir/ --compare-dest=/home/jesse/test/tdir/mon/ /home/jesse/test/tdir/tue/ /home/jesse/test/tdir/wed/ /home/jesse/test/tdir/thu/ --backup-dir=/home/jesse/test/tdir/thu/ 
sending incremental file list 
./ 
file3 
file4 
file5 
file6 

sent 438 bytes received 95 bytes 1,066.00 bytes/sec 
total size is 0 speedup is 0.00 
[[email protected] test]$ tree 
. 
├── sdir 
│ ├── file1 
│ ├── file2 
│ ├── file3 
│ ├── file4 
│ ├── file5 
│ └── file6 
└── tdir 
    ├── fri 
    ├── mon 
    │ ├── file1 
    │ └── file2 
    ├── thu 
    │ ├── file3 
    │ ├── file4 
    │ ├── file5 
    │ └── file6 
    ├── tue 
    │ └── file3 
    └── wed 
     ├── file3 
     ├── file4 
     └── file5 

7 directories, 16 files 
[[email protected] test]$ 
+0

你確定'--backup-dir'是你想要的方式嗎?我是'--link-dest'中的一個更大的信任者,這樣每個備份都可以完全使用,並且具有與先前備份相同的文件。這就是說,通過'--itemize-changes'('-i')選項探索你所看到的。可能會幫助您查看可能導致比較失敗的原因,如果這實際上是問題所在。 – ghoti

+0

爲什麼要問--backup-dir是否要走?是不是很糟糕......當使用--dry-run和沒有--dry-run時,我看到備份開關的結果不一致。使用--dry-run,它會給我正確的文件進行更新,但如果沒有--dry-run,它會複製自原始備份以來發生更改的所有內容。 – Jess

+0

當我運行'rsync source mon'命令時rsync工作的罰款。它同樣適用於'rsync源星期一',但是當我運行'rsync源--compare-dest =星期一星期三'時,這種情況會中斷並給我自從星期一起改變的一切,並進入星期三。使用'--backup-dir'似乎給了我'--dry-run'正確的結果,但是當我沒有它運行它時,它會做同樣的事情。 – Jess

回答

1

我注意到,rsync手冊頁明確指出「開始在2.6.4版本中,多--link-dest目錄可以提供」,並有一個類似的說明爲--compare-dest但不是--backup-dir(這是有道理的)。如果你想限制你的備份「只有不在其他目錄之一中的東西」,--*-dest選項是要走的路。

這裏是我的測試和結果:

$ mkdir src mon tue wed 
$ for n in {1..3}; do date > src/file$n; sleep 1; done 
$ rsync -avi src/ mon/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file1 
>f+++++++ file2 
>f+++++++ file3 

sent 346 bytes received 92 bytes 876.00 bytes/sec 
total size is 87 speedup is 0.20 
$ for n in {4..5}; do date > src/file$n; sleep 1; done 
$ rsync -avi --compare-dest=$PWD/mon/ src/ tue/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file4 
>f+++++++ file5 

sent 295 bytes received 70 bytes 730.00 bytes/sec 
total size is 145 speedup is 0.40 
$ for n in {6..7}; do date > src/file$n; sleep 1; done 
$ rsync -avi --compare-dest=$PWD/mon/ --compare-dest=$PWD/tue/ src/ wed/ 
building file list ... done 
.d..t.... ./ 
>f+++++++ file6 
>f+++++++ file7 

sent 319 bytes received 70 bytes 778.00 bytes/sec 
total size is 203 speedup is 0.52 
$ 

這裏的顯着區別是,比較目錄的每個需要自己選擇。記號是不是:

rsync --compare-dest one/ two/ src/ dest/ 

而是:

rsync --compare-dest=one/ --compare-dest=two/ src/ dest/ 

爲了把這個成被每天運行的代碼,你可以嘗試類似如下(未經測試腳本):

#!/usr/bin/env bash 

# Store our rsync arguments in an array, for easier handling. 
rsync_args=(-a) 

# If we're running interactively, show us rsync verbose output. 
if [ -t 0 ]; then 
    rsync_args+=(-vi) 
fi 

# Step through weekdays, adding days to our argument list, stopping at "today" 
read today < <(date '+%a') 
for day in Mon Tue Wed Thu Fri; do 
    [ "$day" = "$today" ] && break 
    rsync_args+=(--compare-dest=$PWD/${day,,}) 
done 

# And finally, copy everything. 
rsync "${rsync_args[@]}" src/ "${day,,}"/ 

請注意,參數擴展(${s,,}${s^^})中的bash案例控件是bash版本4的特性。

+0

謝謝。這正是我想要做的。你是一位天才先生。還有一個問題。我注意到沒有改變的目錄被複制到沒有文件的目標,這是有道理的,但有沒有辦法阻止在目的地創建目錄名稱。 – Jess

+0

很高興能幫到你!如果此答案似乎爲您解決問題,請隨時通過單擊答案左側的複選標記將問題標記爲已關閉。 :-)至於跳過空目錄,我從rsync的手冊頁看到有一個'--prune-empty-dirs'選項,你可以嘗試一下。 – ghoti

+0

謝謝你的回覆。我確實看到了這個選項,但我希望rsync跳過的目錄是最新的目錄,沒有任何可更新的目錄。換句話說,如果只有一個文件在一個目錄中改變,我想避免創建整個層次結構。我只希望包含該文件的目錄在目標上創建。這是一個新的問題,我應該發佈在stackoverflow? – Jess