rsync先とdiffで比較する

2024年2月11日

Linux rsync で公開コンテンツを更新する場合、リモートとローカルの diff を取りたいケースにて、rsync –dry-run で更新対象ファイル名がわかりますがこれを別途処理したい場合に前後の情報が余計です。

sending incremental file list
中略
sent 707,043 bytes  received 42,046 bytes  499,392.67 bytes/sec
total size is 6,959,110,108  speedup is 9,290.10 (DRY RUN)

これらの情報を制御するのが -v と –info=name オプションの組み合わせです。v がいつのも指定ですが、 v を外して –info=name を使用することで対象のファイル名のリストとして取得可能になりました。

diff コマンド部分で差異があると戻り値 1 となってしまうため、 || true を追加しています。

#!/bin/bash
# /var/www/wordpress -> /var/www/wordpress
fromDir=/var/www/wordpress/
toDir=/var/www/wordpress/
user=gcpuser
host=127.0.0.1

mode=$1

case $mode in
"diff")
echo "Chcek diff"
list=$(rsync -azC --delete $fromDir* $user@$host:$toDir --info=name \
 --exclude="tmp/*" \
 --exclude="logs/*" \
 --exclude="lib" \
--dry-run)
for fname in $list
do
if [ -f $fromDir$fname ]; then
#echo $fname
diff -u <(ssh $user@$host "cat $toDir$fname") $fromDir$fname || true
fi
done
;;

"sync")
echo "Execute sync"
rsync -vazC --delete $fromDir* $user@$host:$toDir \
 --exclude="tmp/*" \
 --exclude="logs/*" \
 --exclude="lib" \
#--dry-run
;;

*)
echo "Execute dry-run"
rsync -vazC --delete $fromDir* $user@$host:$toDir \
 --exclude="tmp/*" \
 --exclude="logs/*" \
 --exclude="lib" \
--dry-run
;;
esac

このスクリプトはリモートにのみ存在するファイルの diff は検知しないので注意。