rsyncでリモートのディレクトリと同期とるよ

# はじめに
Linuc201の勉強しててついにrsyncの話題が。
「そろそろrsyncもちゃんと覚えるか…」と思ったので勉強することにした。

# 参考サイト
検証環境の作り方から説明してくれたので超親切！

https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-ja

# 検証用のファイル一式を作成する
検証用のサーバにログインして、
以下のコマンドささっとrsync検証に使うファイルを一式つくっちゃお！

```
cd ~
mkdir dir1
mkdir dir2
touch dir1/file{001..010}
```

できた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d3a66afa-2fe2-e3c3-b350-cf9ff31a1b38.png)

# ローカル内のディレクトリ同士で同期とる（dir1→dir2）
同じシステムでdir1の内容をdir2に同期するのは以下のコマンド。

```
rsync -r dir1/ dir2
```

-rは再帰的って意味なので、ディレクトリ同期には必須。
…でもいいんだけど、***-n***もしくは***--dry-run***を入れてあげると試し打ちができる。
かつ、-vを入れると実行結果がわかるので尚よし。

やってみよう

```
rsync -rnv dir1/ dir2
```

結果はコチラ。dry-runの結果が出た。で、dry-runなのでdir1からdir2への移動は行われなかった。予想通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c0abc237-0cdd-b903-2afc-3b8b829d2374.png)

-vを入れなかったらどうなるか試してみた。

```
rsync -rnv dir1/ dir2
```

プロンプトだけ返しきた、よくわからない。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/576937b7-5fc1-7405-98c1-895cdf0ccc7f.png)

でも、-nの必要性はわかった。rsyncが失敗したらその結果を返してくれるんだね。ナルホド。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/19851070-c287-20d5-bea9-b23bda6dd60e.png)

## 注意！送信元は末尾に/をつけないとディレクトリごとコピーしちゃう件
↑↑のお手本のコマンドだと、なぜかdir1ではなくdir1/にしていた。
なんでこんなことするのか不思議に思って試してみたらすぐにわかった。
dir1/にすることでdir2の配下にdir1配下のファイルすべてをコピーするらしく
dir1だけだと、dir2の配下にdir1をコピーしちゃうようだ。危ない危ない。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f6288202-4dd4-7ce9-638a-e90a182af127.png)

## 豆知識：-aと-rは違うよって話
やればわかると思ったのでやってみた。
-aは「archive」を表すこのオプションは、再帰的に同期し、シンボリックリンク、スペシャルファイル、デバイスファイル、変更時刻、グループ、所有者、パーミッションを保持する。
-rは単に再帰的にコピーするだけなのでコピー後の権限はumaskに従うっぽい（確認したら0022だったので755でコピーするってこと）

比較結果はコチラ。

### -rでrsyncしたとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e2295194-af1e-2d71-910f-974de1470fa8.png)

### -aでrsyncしたとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e4d9ff72-d4c1-8862-00c2-32084ebc120c.png)

## 検証：rsync元のファイルを削除したらその結果をrsync先に反映してくれるかな？
結果：してくれませんでした。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f51d84c3-0cbf-f153-8125-ab2b861336e7.png)

rsync先のファイルを削除したいなら***--delete***を使えばいいそうです。

```
# dry-runはコッチ
rsync -anv --delete dir1/ dir2
# 実際にやるならコッチ
rsync -av --delete dir1/ dir2
```

### dry-runの結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/082dda7b-08e0-80ae-e2a4-50b2b6fa3d2d.png)

### 実際に試した結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/8aef22af-faf3-c749-94d7-4c4dd3a0f4d4.png)


# リモートサーバへrsyncする
ついにお目当ての手順にたどり着いた
検証用にrsync先のサーバを用意した、

||HOST名|IP|
|:--|:--|:--|
|転送元|nbfr151v|10.0.0.4|
|転送先|nbfr152v|10.0.0.5|

実行したコマンドはこちら

```
rsync -a dir1 nabehiro@10.0.0.5:/home/nabehiro/
```

結果はコチラ。sshで転送しているようなので、sshが使えたらOK。
あと、あらかじめsshdでパスワード認証を許可していたので、いい感じにパスワード聞いてくれてよかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/4523afff-e662-0370-819b-aa40e2fd7b22.png)

転送先にdir1が無事転送されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/ea350d40-1919-fb72-6788-d30fed65e06a.png)

↑↑のやり方はnbfr151vからnbfr152vへpushするやり方だったので、
逆にnbfr151vからnbfr152vのデータをpullするやり方はコチラ。

```
rsync -a nabehiro@10.0.0.5:/home/nabehiro/ /root/dir1
```

検証のため、nbfr151vに追加でfile006を追加してから実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/505210b8-029b-0ce7-6fb1-64b119aa3379.png)


実行結果がこちら。大成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/964e6bb0-d020-269d-2c18-25e6f74decd8.png)