2011-10-12 7 views
8

同期される前にファイルの内容を確認するようにRsyncを設定できますか。私はチェックサムについて聞いたことがありますが、チェックサムはサンプリングしかしていないことを知りました。コンテンツが変更され、タイムスタンプでない場合にのみファイルを転送したいのですが、rsyncモードのいずれかでそれを行う方法があります。 私のシナリオでは、ファイルsample.textが毎週作成され、sample.textの内容が変更された場合にのみリモートサーバーと同期したいとします。毎週作成されるため、タイムスタンプは明らかに変更されます。しかし、私はコンテンツの変更だけで転送が欲しいです。同期する前にrsyncで内容を確認できます

+0

あなたはrsyncのmanページを試してみましたか? -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

+マニュアルページとテストデータの実験で苦労している_ - 非常に良いアドバイス –

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の2番目の行は空です。sedはこの2番目の行を調べます。 – oldbowman

関連する問題