Linux入門:コマンド操作のきほん
rsync で効率的に同期
1 文字直しただけなのに、また 8 分待たされる
画像を含んだ配信物を丸ごとサーバーへ送ると、数分かかることがあります。困るのは 2 回目です。直したのは HTML の 1 行だけなのに、全部を最初から送り直すので、また同じ時間だけ待たされます。
rsync は、送る前に両側を突き合わせて変わったものだけを送ります。手元の 2 つのディレクトリで試すのがいちばん早いので、動きを見てみます。
ターミナル
mkdir -p /tmp/src /tmp/dst
echo hello > /tmp/src/a.txt
echo world > /tmp/src/b.txt
rsync -av /tmp/src/ /tmp/dst/
# a.txt
# b.txtターミナル
echo updated > /tmp/src/a.txt
rsync -av /tmp/src/ /tmp/dst/
# a.txt2 回目に流れたのは a.txt だけです。触っていない b.txt は転送されていません。-a は権限や更新時刻を保ったまま中身ごと運ぶ指定、-v は何を送ったかを表示する指定で、この 2 つはほぼ常に付けます。
末尾のスラッシュ 1 文字で結果が変わる
rsync でいちばん間違えるのがここです。送り元の末尾にスラッシュを付けるかどうかで、届く形が変わります。
ターミナル
rsync -av src/ dst/ # dst の直下に src の中身が並ぶ
rsync -av src dst/ # dst の下に src というディレクトリが作られるやりたいのはたいてい上ですが、うっかり下を実行すると dst/src/ という余計な階層ができます。転送先が空でない場合、これに気づかないまま古い方を参照し続けることになります。
--delete は、向きを間違えると消える
送り元に無いファイルを送り先から消して、完全に同じ状態にするのが --delete です。配信物を入れ替えるときには必要ですが、送り元のパスを 1 文字打ち間違えただけで、送り先の中身がまとめて消えます。
そこで、実行する前に --dry-run を付けて 1 回空打ちします。実際には何も動かさず、これから何を送って何を消すかだけを表示してくれます。
ターミナル
rsync -av --delete --dry-run dist/ prod:/var/www/app/
# deleting old-banner.png
# index.htmldeleting の行に、消えては困るものが入っていないかを目で確かめます。問題なければ --dry-run を外して本番実行します。
除外したいものがあるときは --exclude を並べます。ビルド前の作業物を送らずに済みます。
ターミナル
rsync -av --exclude='node_modules' --exclude='*.log' dist/ prod:/var/www/app/大きなファイルを送る途中で回線が切れても、
-Pを付けておけば次回は続きから再開できます。あわせて進捗も表示されるので、待ち時間の見当がつきます。