2011-10-12 54 views
8

可以將Rsync配置爲在同步之前驗證文件內容。我聽說過校驗和,但我知道校驗只做抽樣。我只想在文件內容發生變化而不是時間戳的情況下傳輸文件,是否有辦法使用任何rsync模式執行此操作。 在我的場景中,比方說每週會創建一個文件sample.text,並且只有在sample.text的內容發生更改時纔會將其與遠程服務器同步,因爲它是每週創建的,時間戳顯然會更改。但我只希望在內容更改時進行轉移。可以在同步之前rsync驗證內容

+0

您是否嘗試過rsync的手冊頁? -c,--checksum 這改變了rsync檢查文件是否已被更改並需要傳輸的方式。如果沒有這個選項,rsync使用「快速檢查」(缺省情況下)檢查每個文件的大小和上次修改的時間是否匹配發送者和接收者。 –

回答

23

是的,你應該閱讀手冊。

$ man rsync | grep "\--checksum" 
    -c, --checksum    skip based on checksum, not mod-time & size 

Rsync相當複雜。我建議在手冊頁上摟抱一下時間,並在測試數據上進行實驗,然後將其用於任何遠程重要的事情。

大多數情況下,人們使用rsync -ac source dest

$ man rsync | grep "\--archive" 
-a, --archive    archive mode; same as -rlptgoD (no -H) 

-rlptgoD垃圾是指:recursivecopy symlinks as symlinkspreserve permissionspreserve timespreserve grouppreserve ownerpreserve device files (super-user only)preserve special files,並且skip based on checksum, not mod-time & size

-c--checksum真的是你正在尋找的東西,你的假設它只是採樣mtime和大小是錯誤的。

+3

+ for _cuddle time with man page and test data with test_ - 非常好的建議 –

8

請參閱rsync手冊頁上的--checksum選項。

此外,如果您確定內容的更改也意味着更改大小,則--size-only選項將是更快的選擇。

0

例子:

#!/bin/bash 
echo > diff.txt 
rsync -rvcn --delete /source/ /destination/ > diff.txt 
second_row=$(sed -n '2p' diff.txt) 
if [ "$second_row" = "" ]; then 
    echo there was no change 
else 
    echo there was change 
fi 
+1

你應該真的添加一些解釋,說明爲什麼這段代碼應該工作 - 你也可以在代碼本身中添加註釋 - 以它的當前形式不提供任何可以幫助社區其他人理解你解決/回答問題的解釋。 – ishmaelMakitla

+0

如果在rsync的詳細模式下diff.txt的第二行爲空,sed會檢查第二行。 – oldbowman