YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Cygwinでもrsyncを使ってみる

同期

今まで研究でデータを出すときは「ローカルで開発」→「ローカルでテスト」→「Subversionにコミット」→「クラスタで作業コピーアップデート」→「クラスタでテスト」としていたのですが,コードを変更するたびにいちいちSubversionに投げるのもばからしいし,そもそもクラスタでは開発しないのだからコピーでいいじゃないかと思いました.

方法

しかしscpでしこしこコピーするのは面倒だし,ファイルの同期を取るのがめんどくさい.で,調べてみるとrsyncというものがあるではないですか!

上記リンクではソースからビルドしてますが,Cygwinパッケージにrsyncがあったので早速インストール.で先輩が使っていたスクリプトをちょろっと改造.

  • sync_node.sh
#! /bin/bash

case $1 in
commit)
    for x in $(seq 1 8); do
        echo "--- commit : node00$x ---"
        rsync -avz $2 username@node00$x:$3
    done
    ;;
del)
    for x in $(seq 1 8); do
        echo "--- del : node00$x ---"
        rsync -avz --delete $2 username@node00$x:$3
    done
    ;;
collect)
    for x in $(seq 1 8); do
        echo "--- collect : node00$x ---"
        rsync -avz username@node00$x:$3 $2
    done
    ;;
*)
    echo "usage : sync_node {commit|del|collect} [local dir] [remote dir]"
    ;;
esac

オプション

rsyncにあるオプションを使いそうなところだけざっとまとめてみた。詳細はこちら。

-a, --archive アーカイブ転送
-v コピー中のファイルを表示
-u, --update タイムスタンプがコピー先より新しいものだけコピー
-p, --perms パーミッションを維持
-t, --times タイムスタンプを維持
--delete コピー元で削除されたファイルはコピー先でも削除

あとコピー元のディレクトリにスラッシュをつける場合とつけない場合で

$ rsync -a /source/dir1 /target/dir2
$ rsync -a /source/dir1/ /target/dir2

前者の場合はコピー元のディレクトリもコピー。(つまりdir1という名前のディレクトリがdir2の中にコピーされる)
後者の場合はコピー元のディレクトリの中身がコピーされる。(つまりdir1とdir1の中身が同じになる)

まとめ

Subversionは便利だけど適材適所でいろいろ検討するとなおよい.