rsync は「ファイルやディレクトリを効率よく同期・転送する」コマンドです。
変更されたファイルだけを転送する差分転送機能が特徴で、バックアップ・デプロイ・サーバー間のファイル同期など幅広い用途で使われます。
基本構文
rsync [オプション] 転送元 転送先
- 転送元 / 転送先: ローカルのパス、またはリモートホスト(
user@host:/path) rsyncは差分のみを転送するため、cpやscpより高速・効率的です
ステップ1:ローカルでのファイルコピー
まずはローカル内での基本的な使い方を確認します。
# 1つのファイルをコピー
rsync file.txt /backup/file.txt
# ディレクトリを同期(-a オプション推奨)
rsync -a ~/documents/ /backup/documents/
注意:
documents/(末尾スラッシュあり)とdocuments(なし)で挙動が変わります。
源/→ ディレクトリの中身を転送先にコピー源→ ディレクトリごと転送先にコピー
# スラッシュありの例:documents の中身が /backup/documents/ に入る
rsync -a ~/documents/ /backup/documents/
# スラッシュなしの例:/backup/documents/documents/ が作られる
rsync -a ~/documents /backup/documents/
ステップ2:よく使うオプション
| オプション | 説明 |
|---|---|
-a | アーカイブモード(-rlptgoD の組み合わせ)。パーミッション・タイムスタンプ・シンボリックリンクを保持 |
-v | 転送中のファイル名を表示(verbose) |
-z | 転送時にデータを圧縮(ネットワーク越しに有効) |
-n / --dry-run | 実際には転送せず、実行結果を確認するだけ |
--delete | 転送元にないファイルを転送先から削除(完全同期) |
--progress | 各ファイルの転送進捗を表示 |
-e ssh | SSH経由で転送(リモート転送時) |
--exclude | 特定のパターンを除外 |
基本的な組み合わせ
# よく使うオプションの組み合わせ
rsync -avz 転送元/ 転送先/
ステップ3:ドライランで確認してから実行
--dry-run(または -n)を使うと、実際には何もせず、転送されるはずのファイルだけを表示できます。
大量ファイルを扱う前の確認に必須です。
# まずドライランで確認
rsync -avn ~/documents/ /backup/documents/
# 問題なければ本番実行(-n を外す)
rsync -av ~/documents/ /backup/documents/
sending incremental file list
report.txt
images/logo.png
sent 1,234 bytes received 42 bytes 2,552.00 bytes/sec
total size is 98,765 speedup is 77.53 (DRY RUN)
末尾に (DRY RUN) と表示されていれば、実際には転送されていません。
ステップ4:リモートサーバーへの転送
rsync はSSH経由でリモートサーバーにファイルを転送できます。
scp と似ていますが、差分転送のため2回目以降は格段に速くなります。
# ローカル → リモート
rsync -avz ~/documents/ [email protected]:/home/user/documents/
# リモート → ローカル
rsync -avz [email protected]:/home/user/documents/ ~/documents/
SSHポートが22番以外の場合は -e でオプションを渡します。
# SSHポートを指定(例: 2222番ポート)
rsync -avz -e "ssh -p 2222" ~/documents/ [email protected]:/home/user/documents/
ステップ5:バックアップに活用する
--delete オプションを加えると、転送元から削除されたファイルを転送先でも削除し、完全な同期を実現できます。
# 転送元と転送先を完全一致させる(削除も同期)
rsync -av --delete ~/documents/ /backup/documents/
--deleteは転送先のファイルを削除します。初めて使うときは必ず--dry-runで確認してください。
特定のファイルを除外する
# .git ディレクトリと *.log ファイルを除外してバックアップ
rsync -av --exclude='.git' --exclude='*.log' ~/project/ /backup/project/
# 除外パターンをファイルにまとめる
cat exclude.txt
# .git
# *.log
# node_modules/
rsync -av --exclude-from='exclude.txt' ~/project/ /backup/project/
ステップ6:転送の進捗を確認する
大きなファイルを転送するときは --progress が便利です。
rsync -avz --progress ~/large-files/ /backup/large-files/
sending incremental file list
video.mp4
512.00M 100% 45.23MB/s 0:00:11 (xfr#1, to-chk=2/4)
data.tar.gz
128.00M 38% 32.10MB/s 0:00:02
ファイルごとのサイズ・転送速度・残り時間が表示されます。
実践例:定期バックアップスクリプト
rsync と cron を組み合わせて、自動バックアップを設定できます。
#!/bin/bash
# backup.sh - ホームディレクトリを外付けドライブにバックアップ
SOURCE="$HOME/"
DEST="/mnt/external/backup/$(hostname)/"
LOG="/var/log/rsync-backup.log"
rsync -avz --delete \
--exclude='.cache' \
--exclude='Downloads' \
"$SOURCE" "$DEST" >> "$LOG" 2>&1
echo "バックアップ完了: $(date)" >> "$LOG"
# crontab に登録(毎日午前2時に実行)
crontab -e
# 0 2 * * * /home/user/backup.sh
練習問題
以下の問題に取り組んでみてください。
問題1
~/test_src/ ディレクトリを作成し、いくつかのファイルを置いた後、~/test_dst/ に rsync で同期してください。転送されるファイルを詳細表示(verbose)で確認すること。
問題2
問題1で同期した後、~/test_src/ 内の1ファイルを削除し、再度 rsync --delete で同期してください。その前に --dry-run で削除対象を確認すること。
問題3
~/project/ 以下を /backup/project/ に同期する際、node_modules/ と *.tmp ファイルを除外するコマンドを書いてください。
問題4
リモートサーバー [email protected] の /var/www/html/ から、ローカルの ~/site-backup/ にファイルを取得するコマンドを書いてください(SSHのデフォルトポートを使用)。
答え
問題1の答え
# 準備
mkdir -p ~/test_src ~/test_dst
echo "hello" > ~/test_src/a.txt
echo "world" > ~/test_src/b.txt
# 同期
rsync -av ~/test_src/ ~/test_dst/
sending incremental file list
a.txt
b.txt
sent 124 bytes received 54 bytes 356.00 bytes/sec
total size is 12 speedup is 0.07
問題2の答え
# ファイルを削除
rm ~/test_src/b.txt
# ドライランで確認
rsync -avn --delete ~/test_src/ ~/test_dst/
# 本番実行
rsync -av --delete ~/test_src/ ~/test_dst/
ドライランの出力に deleting b.txt と表示されることを確認してから本番実行します。
問題3の答え
rsync -av --exclude='node_modules/' --exclude='*.tmp' ~/project/ /backup/project/
複数の除外パターンは --exclude を繰り返して指定します。
問題4の答え
rsync -avz [email protected]:/var/www/html/ ~/site-backup/
-z を付けることでネットワーク転送時の圧縮が有効になります。
まとめ
| やりたいこと | コマンド例 |
|---|---|
| ローカルでディレクトリを同期 | rsync -av src/ dst/ |
| 差分転送(属性も保持) | rsync -a src/ dst/ |
| 圧縮して転送 | rsync -avz src/ dst/ |
| 事前確認(ドライラン) | rsync -avn src/ dst/ |
| 削除も同期(完全一致) | rsync -av --delete src/ dst/ |
| リモートに転送 | rsync -avz src/ user@host:/dst/ |
| リモートから取得 | rsync -avz user@host:/src/ dst/ |
| 特定ファイルを除外 | rsync -av --exclude='*.log' src/ dst/ |
rsync は一度覚えると、バックアップ・デプロイ・ファイル整理など多くの場面で活躍します。
まずは --dry-run で動作確認する習慣をつけると、意図しないファイル操作を防げます。