web-dev-qa-db-ja.com

rsyncがファイルを転送したかどうかを確認するにはどうすればよいですか?

Rsync(cygwin)を使用して、サーバーとPC間でファイルを転送します。

Rsyncは2分ごとに実行され、転送するファイルがある場合とない場合があります。いくつかのアクションを実行する必要がありますが、ファイルがサーバーからPCに転送された場合に限ります。

ファイルが転送されたかどうかはどうすればわかりますか?

P.S. rsyncの終了コードを使おうとしましたが、ファイルが転送されるときと転送されないときの両方で0が返されます。

2
temur_p
rsync -rtv <source> <dest> | wc -l

結果が4を超える場合、何かが変更されました

5
matzeri

オプションを使用します

 rsync ....  --log-file=/path/to/log/file

これはaddsをログファイルに追加するので、何かが転送されたかどうかを確認できます。転送された場合は、バックアップが実行されたときよりもはるかに遅くなります。

3
MariusMatutiae

rsync --stats

オプション--statsまたは--info=stats2を使用して、最終的にgrepでフィルタリングできます。

  rsync -avr ORIG DEST  --stats | grep "Number of created files"

作成されたファイルの数:14


rsyncのマニュアルから読むことができます

-stats
これにより、rsyncはファイル転送時に詳細な統計セットを出力するようになり、rsyncのデルタ転送アルゴリズムがデータに対してどれほど効果的であるかを知ることができます。このオプションは、0または1の-vオプションと組み合わせた場合は--info = stats2、2つ以上の-vオプションと組み合わせた場合は--info = stats3と同等です。

追記:
どのファイルが転送されたかを確認するために好奇心がある場合に備えて、MariusMatutiaeによる 提案 としてログファイルを使用することをお勧めします。
grepフィルターでは、興味深いと思う各行を選択できます。

  • ファイルが転送された出力の例:

    ファイル数:15(reg:14、dir:1)
    作成されたファイルの数:14(reg:14)
    削除されたファイルの数:0
    転送された通常のファイルの数:14
    合計ファイルサイズ:280,860バイト
    転送されたファイルの合計サイズ:280,860バイト
    リテラルデータ:280,860バイト
    一致したデータ:0バイト
    ファイルリストサイズ:0
    ファイルリストの生成時間:0.001秒
    ファイルリストの転送時間:0.000秒
    送信された合計バイト数:281,842
    受信した合計バイト数:285

  • ファイルが転送されていない同じコマンド:

    ファイル数:15(reg:14、dir:1)
    作成されたファイルの数:
    削除されたファイルの数:
    転送された通常のファイルの数:
    合計ファイルサイズ:280,860バイト
    転送されたファイルの合計サイズ:0バイト
    リテラルデータ:0バイト
    一致したデータ:0バイト
    ファイルリストサイズ:0
    ファイルリストの生成時間:0.001秒
    ファイルリストの転送時間:0.000秒
    送信された合計バイト数:357
    受信した合計バイト数:12

1
Hastur

もっと厳密な解決策が欲しかった。 Number of created files:(メッセージは別の言語である可能性があります)をgrepしたり、-v出力(rsyncがどの要約で出力するかを知っている)の2行を除くすべての行を削除したりしたくありません。次のバージョン?)。

rsyncのログの形式は設定できますが、標準出力の形式は設定できないことがわかりました( man rsyncd.conf を参照)。

たとえば、「ファイルが変更されました!」を追加します。実際に変更されたファイルを含む各行に、次にgrep

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi

このアプローチの問題の1つは、--dry-runでは機能しないことです。この場合、--itemize-changesを追加してstdoutを解析する必要があります。そして、そのフォーマットを設定することはできません。

0