前回、ファイルの順次マージを支援するツールが用意できた。これでローカルにあるファイルの取り込みは簡単にできるわけだが、リモートにあるファイルはどうだろう?一つずつ持ってきて比較というのでは遅い*1ので、対象ファイルを一括で取り込みたい。

 今、local/にSubversion作業ディレクトリがあり、リモートホスト$hostにあるファイルはremote/$host/にミラーするものとする。somewhere.example.orgから、local/に存在するファイルだけを持ってくるにはどうすればよいか。

 もったいぶってもしょうがないのですぐに答えを示す。実質ワンライナーだね。

host=somewhere.example.org; \
( cd local && find . \! \( -name .svn -prune \) -type f | sed 's/^\.//' ) \
  | rsync -aRv --files-from=- $host: remote/$host/

 rsync(1)のスラッシュで始まるパターンマッチと、-Rによる相対パス解釈の組み合わせが強力。include/excludeパターンを活用すれば、リモートで余計なディレクトリを突き進むこともない。覚えておきたい手筋。

 もっとも、tipだidiomだとクリップしてありがたがるのではなく、何か捻り出してやろうという気構えが大事。日々工夫。

追記:動かないやつを載せてました。正しいオプションは--files-fromです。日々失敗。


Categories : Tech