サーバーにアップロードするための神コマンド『rsync』!

f:id:araemonz:20180729100900j:plain

rsync をご存知だろうか?

ホームページやWebアプリをサーバーにアップロードする作業、

DreamweaverやFileZilla、FTPやSSH(SCP)などで行なうのが世の常、常識

しかしその常識が本当は非常識だどしたら?

rsync に触れてみれば今までのやり方が非常識だったと思い知らされる

いつもロボットのように機械的に

コンピューターの奴隷になって行なっているアップロード作業も

rsync を知ってしまったら、ボタンをポチッと押してお茶を飲んで待つだけ🍵

いや、待たない

rsync は待たないのだ

なぜならrsyncは変更したファイルの差分のみをアップロードするのだから

ゆえにアップロード作業は一瞬で終わってしまう

待つ必要がないほど、あっという間なのだ

つまりお茶を飲む時間すら与えてくれない🍵🖐

一息つく暇もなくデザインを確認しろと、

バグや修正点乱れはないか確認しろと、

もっとコーディングしろと、

プログラマーをさらに家畜にしてしまうのだ

rsync は恐ろしい…

そんなrsyncと向き合っていくための記録を残すことにする

rsyncについて

Google先生に聞いた特徴をあげてみる

  • ファイル やディレクトリの同期を行う
  • 差分アルゴリズムでデータ転送量が最小になるので転送が高速にできる
  • この差分アルゴリズムがすごそう
  • 開発者はAndrew Tridgellなど複数人の共同開発(sambaの作者でもあるようだ)
  • ローカルはもちろんSSHでリモートでも使える
  • GNU General Public Licence ライセンス
  • TCPポート番号 873 を使う
  • 最初のリリースは1996年?、rsync 2.6.0が2004年1月1日にリーリースされている
  • 2018年1月28日現在はversion 3.1.3がリリースされている
  • MacBook Proに初めから入っていたバージョンはversion 2.6.9だった

参考:

rsyncを最新版にアプデート

Macで最初から入っているバージョンは古いので更新する

brew install rsync

ターミナル再起動でおkだった

簡単だ

rsync --version
rsync  version 3.1.3  protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes, no prealloc, file-flags

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsyncの書式

書式:

rsync [オプション] コピー元 コピー先

オプション:

記号       意味
-a         archive mode( コピー元のディレクトリを再帰的にコピー)
-v         increase verbosity (コピーしているファイル名やバイト数などの情報を表示)
-u         skip files that are newer on the receiver ( コピー元とコピー先を比較し、追加・更新されたファイル・ディレクトリのみをコピー)
-n         dry-run (お試し実行)
--delete      コピー元にないファイルをコピー先で削除してコピー元とコピー先を同期

参考:

https://webkaru.net/linux/rsync-command/

rsyncのコピー元のスラッシュの重要性

コピー元にスラッシュをつけるかつけないかで対象とするファイルが異なる。

rsync -av src dst

f:id:araemonz:20180729100944j:plain

rsync -av src/ dst

f:id:araemonz:20180729100959j:plain

コピー元/コピー元/* と理解するとわかりやすい。

次では実際にスラッシュによる振る舞いの違いを見ていく。

rsyncの動作確認その1

下のようなディレクトリ構造を作ってテストしてみよう。

srcディレクトリをdst内のsrcディレクトリへ同期させるけれど、書き方の違いでどう処理が変わるか違いを見ていこう。

home/

├src/

│└ new.txt

└dst/

  └src/

   └ old.txt

  

1. コピー元、コピー先の両方にスラッシュをつけない

rsync -av src dst/src
ls dst/src
src old.txt

dst/srcの中に新しいsrcが入ってしまった😞

2. コピー元のみにスラッシュをつける

rsync -av src/ dst/src
ls dst/src
new.txt old.txt

イメージ通りにnew.txtが追加された!😀

3. コピー元、コピー先の両方にスラッシュをつける

rsync -av src/ dst/src/
ls dst/src/
new.txt old.txt

2番と同様の結果だ😀

4. コピー先のみにスラッシュをつける

rsync -av src dst/src/
ls dst/src
src old.txt

1番と同様のdst/srcの中に新しいsrcが入ってしまった😞

5. コピー元にスラッシュをつけず、コピー先のディレクトリ名を省略する

rsync -av src dst/
ls dst/src
new.txt old.txt

これもうまくいった!😀

6. コピー元にスラッシュをつけ、コピー先のディレクトリ名を省略する

rsync -av src/ dst/
ls dst/
new.txt src

dstディレクトリの階層にファイルが追加されてしまった😞

ここまでのまとめ

正しく同期できた書き方は以下となった。

rsync -av src/ dst/src
rsync -av src/ dst/src/
rsync -av src dst/

rsyncの動作確認その2 --delete付き

--deleteは危険なので以下はコピペして使わないことをお勧めする。

動作確認その1と同じ構造のディレクトリを用意。

今度は--deleteオプションをつけて、コピー元に存在しないファイルはコピー先でも削除して同期するようにしてみよう。

home/

├src/

│└ new.txt

└dst/

  └src/

   └ old.txt

  

rsyncの動作確認その1 でおこなった、2、3、5番の3パターンに—deleteオプションを追加して試してみよう。

rsync -av --delete src/ dst/src
rsync -av --delete src/ dst/src/
rsync -av --delete src dst/

結果はどれも同じでold.txtが削除され、新たにnew.txtが追加され同期される。これなら問題なさそうだ。

ls dst/src
new.txt


今度はrsyncの動作確認その1で行なった、1番と4番に—deleteオプションを追加して試してみよう。

rsync -av --delete src dst/src
rsync -av --delete src dst/src/

1番と4番は dst/src/ の中にさらにsrcを作ってしまったが、old.txtは削除されていない。

ls dst/src/        
old.txt src

それでは最後にrsyncの動作確認その1で行なった、6番に—deleteオプションをつけて実行してみることにしよう。

rsync -av --delete src/ dst/

なんとdst内のsrcをまるまる削除してしまった。

むなしく残っているのはnew.txtのみである。

ls dst
new.txt

srcの中身をdstにまるごと同期したいならいいかもしれないが。

スラッシュの違いを理解してどこのディレクトリを操作するのかイメージできていないと大変なことになってしまう。

おさらいだがコピー元にスラッシュをつけると、そのディレクトリ以下のファイル群を対象とし

スラッシュをつけなければ、ディレクトリごとを対象 とする。

コピー元/コピー元/* と理解しよう。

rsync -av src dst

rsync -av src/ dst

dry-run (お試し実行) というのがある。

-nオプションでいける

実際には同期されないのでまずは、本番を実行する前にテストで確認する癖をつけよう。

rsync -avn --delete src/ dst/
sending incremental file list
deleting src/old.txt
deleting src/
./
new.txt

参考:

https://qiita.com/QUANON/items/2953c52df7f65f2ecee5

https://qiita.com/mitzi2funk/items/9308db56829d7b4cb90d