rsyncでサーバーにファイルを簡単アップロード【rsyncの基本的な使い方と注意点】



rsync はファイルの同期を差分で行ってくれる大変便利なシェルコマンドだ。

サーバー上のファイルも同期が取れるため、これがないと仕事ができないと言っても過言ではない。
DreamweaverやFileZilla、FTP、そしてSCPなどで行っていたら正直仕事が捗らない。
昔はそれでアップロード作業をしていたっす😓

rsyncを知ってからは、アップロード作業が格段に楽になったので、まだ使ったことがない方はこれを期に是非ためしてみてはいかがだろうか。

rsyncはとても便利なコマンドではあるが、一つ間違えるとファイルを削除しかねないので使い方には十分注意が必要だ。

この記事ではそのようなことのないように、rsyncのファイル同期と注意点を、実際に動作確認をしながら説明していく。







rsyncをMacにインストールする


Macにはrsyncが最初から入っているが、バージョンが古いので更新しよう。

$ brew install rsync

brewでインストール後、ターミナルを再起動する。


こちらの環境では、$ rsync --version でバージョンを確認すると3.1.3となった。

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 の使い方は、いたって簡単。次のように、コピー元とコピー先を指定してやればファイルの同期を差分でやってくれる。そして差分ゆえに同期はあまりにも速い。

$ 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


まずはコピー元にスラッシュを付けない場合、ファイルのコピーの対象となるファイルは下の図の青い部分となる。これは src ディレクトリそのものを含むことになる。




しかし、コピー元にスラッシュを付けた場合、どうなるだろうか?
$ rsync -av src/ dst


この場合、下の図のように src ディレクトリはコピーの対象に含まれず、src 以下のファイル群だけがコピーされることとなる。


「どっちもファイルがコピーされるのだから、一緒じゃん?」と思われるかもしれないが、この違いが結構重要。
rsyncの場合、コピー元と先で同じ構成の同期をとることになるので、ここら辺が曖昧だと、うっかりファイルを削除しかねない。

スラッシュ付き指定の場合は、 コピー元/* と同じであると理解すると良いかもしれない。

次は、実際にスラッシュによる振る舞いの違いを見ていくことにしよう。





rsyncの動作確認【基本編】


それでは実際に動作確認をしていく。

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

home/
├src/
│ │
│ └  new.txt
│
└dst/
  │
  └src/
   │
   └ old.txt


srcディレクトリをdst内のsrcディレクトリへ同期させるのが目標となる。





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


$ rsync -av src dst/src


$ ls dst/src
src old.txt


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



コピー元のみにスラッシュをつけた場合


$ rsync -av src/ dst/src


$ ls dst/src
new.txt old.txt


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


コピー元、コピー先の両方にスラッシュをつけた場合


$ rsync -av src/ dst/src/


$ ls dst/src/
new.txt old.txt


2番と同様の結果だ😀



コピー先のみにスラッシュをつけた場合


$ rsync -av src dst/src/


$ ls dst/src
src old.txt


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


コピー元にスラッシュをつけず、コピー先のディレクトリ名を省略した場合


$ rsync -av src dst/


$ ls dst/src
new.txt old.txt


これもうまくいった!😀


コピー元にスラッシュをつけ、コピー先のディレクトリ名を省略した場合


$ rsync -av src/ dst/


$ ls dst/
new.txt src


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



ここまでのまとめ【正しく同期できた書き方】


ここまでで、正しく同期できた書き方は次の3つである。

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






rsyncの動作確認【--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には dry-run (お試し実行) というのがある。

-nオプションをつけることで可能になる。
これは同期をせずに、もし同期する場合に対象となるファイルを標準出力してくれるもので、大変便利なオプションだ。

不安な方は、本番の同期を実行する前に必ず dry-run を試した方が良いだろう。

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


以上で rsync の基本的な使い方の説明は終わりとなる。





rsyncの補足


最後に、rsync は次のような特徴があることを補足しておく。

* ファイル やディレクトリの同期を行うことができる
* 差分アルゴリズムでデータ転送量が最小になるので転送が高速にできる
* 開発者はAndrew Tridgellなど複数人の共同開発(なんと、sambaの作者でもあるようだ)
* ローカルはもちろんSSHでリモートでも使える
* GNU General Public Licence ライセンス
* TCPポート番号 873 を使う
* 最初のリリースは1996年からのようだ



参考


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




あなたにおすすめ