リモートサーバーとローカルPC間でファイルをやり取りする場面は、開発や運用の現場では日常的に発生します。特にディレクトリ全体を同期させたい場合、「どのファイルが新しくて、どれが不要か」を手動で判断するのは手間も時間もかかります。そんなときに役立つのが、Linuxで使える「rsync」コマンドです。rsyncは、高速かつ信頼性の高いファイル転送を実現し、差分だけをコピーすることで通信コストを抑えることができます。本記事では、rsyncの基本的な使い方から、リモートとローカル間でのディレクトリ同期の方法、よく使うオプションや注意点まで、わかりやすく解説していきます。
rsyncとは?基本の概要を理解しよう
rsync(アールシンク)は、UNIX系OSで広く利用されているファイル同期ツールです。ローカル間のファイルコピーはもちろん、リモートのマシンとの間でもファイルを同期することができます。rsyncの最大の特徴は、「差分転送」ができる点です。つまり、変更があったファイルだけを検出して転送するため、大量のデータがある場合でも高速に同期できます。
また、SSHを通じて通信を行うため、安全性も確保されており、セキュリティの観点からも安心です。
rsyncの基本的な構文
rsyncの基本的な構文は以下のとおりです。
rsync [オプション] コピー元 コピー先
ローカル同士の例
rsync -avh /home/user/data/ /mnt/backup/data/
リモートからローカルへ同期する例
rsync -avz user@remote-server:/var/www/html/ ~/backup/html/
ローカルからリモートへ同期する例
rsync -avz ~/projects/myapp/ user@remote-server:/home/user/myapp/
よく使うrsyncのオプション解説
rsyncには多くのオプションがありますが、ここではよく使われる主なオプションを紹介します。
オプション | 説明 |
---|---|
-a | アーカイブモード。ディレクトリやシンボリックリンク、パーミッションなどを保持 |
-v | 詳細出力(verbose)を有効にする |
-z | 転送中にデータを圧縮する(通信速度が遅い環境で有効) |
-h | 出力を人間が読みやすい形式にする(ファイルサイズなど) |
--delete | コピー元にないファイルをコピー先から削除する(完全な同期を取りたいときに使用) |
-e ssh | SSH経由で通信するよう指定する(通常は省略可能) |
rsyncでリモートとローカルを同期する実践例
ここからは、具体的なシナリオでrsyncの使い方を見ていきましょう。
1. リモートサーバーのディレクトリをローカルに同期
rsync -avz user@example.com:/home/user/website/ /home/localuser/website_backup/
このコマンドでは、リモートサーバーの /home/user/website/
ディレクトリを、ローカルの /home/localuser/website_backup/
に同期します。-a
で属性を保持し、-v
で出力を表示、-z
でデータを圧縮して転送しています。
2. ローカルの変更をリモートに反映させる
rsync -avz ~/project/ user@example.com:/home/user/project/
こちらはローカルの ~/project/
をリモートのディレクトリへ同期する例です。Web開発などで、最新のソースコードをサーバーに反映したいときに使われます。
3. 双方向同期ではなく、片方向同期に注意
rsyncは「片方向」の同期です。つまり、コピー元が正であり、コピー先はそれに合わせて変更されるという動作です。双方向の同期をしたい場合は、unisonなどの別ツールを使うか、スクリプトを組んで管理する必要があります。
–deleteオプションを使った完全同期
rsyncは基本的にコピー元に存在しないファイルは削除しませんが、--delete
オプションを使うことで「完全に一致した状態」にできます。
rsync -avz --delete ~/data/ user@remote:/home/user/data/
注意点としては、間違えるとデータが削除されてしまうリスクがあるため、必ずテストしてから運用しましょう。初めは --dry-run
を付けて挙動を確認すると安心です。
rsync -avz --delete --dry-run ~/data/ user@remote:/home/user/data/
rsyncをcronで定期実行する
rsyncは手動でも使えますが、定期的に同期させたい場合はcronと組み合わせて自動化するのが便利です。
crontab -e
以下のように記述すれば、毎日深夜2時にリモートとローカルの同期が行われます。
0 2 * * * rsync -avz user@remote:/var/www/html/ ~/backup/html/
ログを残したい場合はリダイレクトを使います。
0 2 * * * rsync -avz user@remote:/var/www/html/ ~/backup/html/ >> /var/log/rsync.log 2>&1
rsyncの注意点とトラブルシューティング
1. ディレクトリ末尾の「/」の意味
コピー元のパスに「/」があるかないかで動作が変わるため注意が必要です。
/home/user/data/
→ ディレクトリの中身をコピー/home/user/data
→ ディレクトリごとコピー
これはよくあるミスなので、意識して書くようにしましょう。
2. パーミッションの違いに注意
ファイルの権限が変わってしまうことがあります。必要に応じて -a
を使ったり、--chmod
オプションで制御することも検討しましょう。
3. SSHのポート番号がデフォルトでない場合
例えばSSHが22番以外を使っている場合は、-e
オプションで指定します。
rsync -avz -e "ssh -p 2222" ~/data/ user@remote:/home/user/data/
まとめ
rsyncは、Linux環境における非常に強力な同期ツールです。差分転送による効率的なファイル同期、安全なSSH通信、多彩なオプションにより、初心者から上級者まで幅広く活用されています。本記事で紹介したように、rsyncを使えばローカルとリモート間のディレクトリ同期が簡単に行えるようになります。定期的なバックアップやWebサーバーの更新など、様々な用途で活用してみてください。