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

/




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 コピー元にないファイルをコピー先で削除してコピー元とコピー先を同期



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


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

rsync -av src dst





rsync -av src/ dst





コピー元/コピー元/* と理解するとわかりやすい。
次では実際にスラッシュによる振る舞いの違いを見ていく。



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://rsync.samba.org
https://ja.wikipedia.org/wiki/Rsync
https://webkaru.net/linux/rsync-command/
https://qiita.com/QUANON/items/2953c52df7f65f2ecee5
https://qiita.com/mitzi2funk/items/9308db56829d7b4cb90d