rsyncがbashで変更を行ったかどうかを確認するにはどうすればよいですか?


12

リモート->ローカルシナリオでrsyncを使用してデータを同期するスクリプトがあります。rsyncコマンドを実行した直後に、エラーコードがゼロに等しいかどうかを確認します。ゼロの場合、さらにコマンドが実行されます。ただし、これはrsyncが正常に実行された可能性があるが実際には変更を行わなかったという事実を考慮していません。このため、等しいゼロ条件が実行されますが、これは少し冗長です。

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

これを拡張して、実行されたrsyncコマンドに基づいて実際に変更があったかどうかを確認するための最良の方法は何でしょうか。-iフラグはstdoutに出力を提供できると読みましたが、これを条件付きブロックに配置するにはどうすればよいですか?


あなたは-vそこにいるので、それはあなたが標準出力に必要な情報をすでに提供しています...例えば、実際に送信されたファイルのリスト。何も変更されなければ、それだけ./です。
goldilocks 2015

ああ!-vを削除し、代わりに-iを使用してから、rsyncコマンドで空でない文字列チェックを使用するとどうなりますか?
ジェームズホワイト

自分で解決策を見つけたようですか?:-)
ビョルンムンク

2
使用できますa=$("rsync command")。これによりrsyncコマンドが実行され、に保存さstdoutaます。その後、テストを実行できますa
nitishch 2015

1
| grep /または、そのようなものを追加し、でgrepの終了ステータスを確認することもでき$?ます。出力がなかった場合は1である必要があります。
ビョルンムンク2015

回答:


9

私の元の質問へのコメントに基づいて、-iフラグを使用してrsync出力をstdoutに作成し、文字列以外のチェック条件を使用して、エラーコードチェック内で実際に変更されたものがあるかどうかを確認します。変数にrsyncコマンドをラップすると、チェックを実行できます。

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

潜在的な欠点としては、冗長な出力を失う必要がありますが、代わりにいつでもファイルに記録できます。


1

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

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

たとえば、「File changed!」を追加します。実際に変更されたファイルを含む各行に、次にそれの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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.