伝統的にはrsyncはrshを利用したり云々でファイルを転送するツールだっのだが、今日日は大抵SSHを利用してファイルを転送する。なので昔は-e sshというオプションをつけるなり、環境変数で定義するなりしていたのだが、最近はいらなくなったようだ。いつからいらなくなったとかその辺は適当に調べてください。
適当に何か作る(ローカルで)
% mkdir moge % touch moge/{a,b,c} % find moge moge moge/a moge/c moge/b
このmoge/を192.168.11.112の/tmpに転送したいとする。基本は-avzというオプションを付ける。
% rsync -avz moge 192.168.11.112:/tmp user@192.168.11.112's password: sending incremental file list moge/ moge/a moge/b moge/c
これで転送された。実際にリモートにアクセスして見てみよう。
リモートに、/tmp/mogeが存在していた場合はどうなるか。同様にコマンドを打ってみよう。
% rsync -avz moge 192.168.11.112:/tmp
リモート
find /tmp/moge/ /tmp/moge/ /tmp/moge/a /tmp/moge/b /tmp/moge/c
他に抑えておくべきは2パターンある
% rsync -avz moge 192.168.11.112:/tmp/moge
リモート
/tmp/moge/ /tmp/moge/moge /tmp/moge/moge/a /tmp/moge/moge/b /tmp/moge/moge/c
% rsync -avz moge/ 192.168.11.112:/tmp
リモート
$ find /tmp/ /tmp/ /tmp/a /tmp/b /tmp/c /tmp/moge
このように 第一引数がディレクトリの場合、末尾に/が付くか付かないかで挙動が変わり過ぎるので注意。
基本は第一引数と第二引数を入れかえるだけで、リモートの/tmp/moge/{a,b,c}があった場合、それを転送する方法から入ろうか。
% rsync -avz 192.168.11.112:/tmp/moge . user@192.168.11.112's password: receiving incremental file list moge/ moge/a moge/b moge/c
ローカル
% find moge moge moge/a moge/c moge/b
これもいろいろある
% rsync -avz 192.168.11.112:/tmp/moge .
ローカル
% find moge moge moge/a moge/c moge/b
% rsync -avz 192.168.11.112:/tmp/moge moge
ローカル
% find moge moge moge/moge moge/moge/a moge/moge/c moge/moge/b
% rsync -avz 192.168.11.112:/tmp/moge/ .
これは注意しないといけない。カレントにmoge/以下の内容がぶちまけられる。
rsync、その名の通りsyncなので完全に同じにする事ができるわけだ。これを実現するために–deleteオプションがある。
たとえば、ローカルがこうなっているとしよう
% find moge moge moge/a moge/b moge/c
リモートの/tmp以下がこうだとする
$ find /tmp/moge/ /tmp/moge/ /tmp/moge/a /tmp/moge/g /tmp/moge/e
ここでまずどちらに合わせるのかが重要なわけだが、要件にもよるかと思う。そしてどちらから送るのか、これも要件によるが、ここではこう定義しよう。
ローカルからリモートにpushし、リモートの/tmp以下をローカルと同じにする(/tmp/moge/{a,b,c})
このようにするのだが、、、
% rsync --delete -avz moge 192.168.11.112:/tmp
–deleteを使う場合は–dry-runしておくのがいい
% rsync --delete -avz moge 192.168.11.112:/tmp --dry-run user@192.168.11.112's password: sending incremental file list moge/ deleting moge/g deleting moge/e moge/a moge/b moge/c
何が消されるのか一目瞭然だ。しかしながらファイルが大量にある場合はよくわからんかもしれない。いずれにせよ、第一引数側が優先される
ためしに、リモートの/tmp/mogeの内容にローカルを同期してdeleteさせるものとしよう。
% rsync --delete -avz 192.168.11.112:/tmp/moge . --dry-run user@192.168.11.112's password: receiving incremental file list deleting moge/c deleting moge/b moge/ moge/a moge/e moge/g
このような感じ。
なお、deleteオプションはまったなしなので心配ならコピーを取っておく事でしょうな