rsyncを使用してリモート - >ローカルシナリオでデータを同期するスクリプトがあります。 rsyncコマンドを実行した直後にエラーコードが0であることを確認してください。 0 の場合、追加コマンドが実行されます。しかし、これは実際に変更せずに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に出力を提供できることを読みました。しかし、これを条件付きブロックにどのように配置しますか?
答え1
私の元の質問に対するコメントに従って、-iフラグを使用して出力をstdoutにrsyncし、文字列以外のチェック条件を使用してエラーコードチェックに実際の変更があるかどうかを確認します。 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
潜在的な欠点は、詳細な出力を失う必要がありますが、いつでもファイルに書き込むことができることです。
答え2
もっと厳しい解決策が欲しいです。私はgrepを実行したりNumber of created files:
(メッセージが別の言語になっている可能性があります)、出力-v
に2行だけ残してすべてを削除したくありません(rsync
次のバージョンにどのサマリーが印刷されるのか誰がわかりますか?)。
編集する:aのrsync
出力形式を次に設定できることがわかりました。変更されたファイルのリスト--out-format
:
rsync -a --verbose source-dir target-dir \
--out-format='changed file: %i %n%L' \
| fgrep 'changed file:'
または、ファイルの時間は気にしませんが、コピーを最小限に抑えたい場合は、拡張され削除されたバリアントを使用できます-a
。
rsync -r --links --devices --specials \
--delete --checksum \
--omit-dir-times --omit-link-times --ignore-times \
--prune-empty-dirs \
--verbose \
source-dir target-dir
前の回答:log形式を指定できますがstdout形式はできません(参照)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