メインコンテンツへスキップ
中級12分で読める

rsyncで効率的なファイル同期

強力なファイル同期ツールrsyncを使って、ローカル・リモート間のファイル転送やバックアップを効率的に行う方法を実例を交えて詳しく解説します。

効率化編rsyncファイル同期バックアップ転送効率化

🎯 この記事で学べること

  • 1
    rsyncの基本的な使い方をマスターできます
  • 2
    差分転送による効率的なファイル同期方法が理解できます
  • 3
    ローカル・リモート間のファイル転送ができるようになります
  • 4
    バックアップやミラーリングの実装方法が身につきます
  • 5
    除外パターンやフィルタリングの活用法がわかります

読了時間: 約12

rsyncとは

rsync(Remote Sync)は、ローカルまたはリモート間でファイルやディレクトリを効率的に同期するための強力なツールですね。

差分転送アルゴリズムを使って、変更された部分のみを転送するんです。これにより、大量のファイルや大容量ファイルの同期でも高速に動作するという特徴があります。

特に、定期的なバックアップや、開発環境と本番環境の同期など、実務でよく使われるツールなんですよ。

rsyncの特徴

主な利点

rsyncには、他のコピーコマンドにはない優れた特徴がたくさんありますね。主な利点を見ていきましょう:

  • 差分転送: 変更された部分のみを転送するので、時間と帯域幅を節約できます
  • 圧縮転送: 転送中のデータを圧縮できるので、ネットワーク負荷を軽減できます
  • 再開可能: 中断された転送を再開できるので、大容量ファイルでも安心です
  • 権限保持: ファイルの権限やタイムスタンプをそのまま保持できます
  • 除外機能: 特定のファイルやパターンを除外できるので、柔軟な同期が可能です
  • 暗号化: SSH経由で安全に転送できるので、リモート同期も安心です

基本的な使い方

ローカルでのファイル同期

まずは、ローカル環境でのrsyncの基本的な使い方から見ていきましょう。基本構文はとてもシンプルですよ:

# 基本構文
rsync [オプション] 送信元 送信先

# ディレクトリをコピー
rsync -av /source/directory/ /destination/directory/

# ファイルをコピー
rsync -av file.txt /backup/

# 複数のファイル/ディレクトリをコピー
rsync -av file1.txt file2.txt dir1/ /destination/

💡 重要なポイント: ディレクトリをコピーする時、送信元の最後に/をつけるかどうかで動作が変わります:

  • /source/directory/ → directoryの中身を送信先にコピー
  • /source/directory → directory自体を送信先にコピー

重要なオプション

rsyncには多くのオプションがありますが、よく使うものを覚えておけば大丈夫です:

# よく使うオプションの組み合わせ
-a  # アーカイブモード(権限、タイムスタンプ等を保持)
-v  # 詳細表示(何をコピーしているか確認できます)
-h  # 人間が読みやすい形式で表示(ファイルサイズなど)
-z  # 転送時に圧縮(ネットワーク転送で特に有効)
-P  # 進捗表示と部分転送の保持(大きなファイルで便利)

# 実用的な組み合わせ
rsync -avhP source/ destination/

🎯 初心者におすすめ: まずは-avhPの組み合わせを覚えておきましょう。これだけで、ほとんどの用途に対応できますよ!

リモートとの同期

SSH経由での転送

# リモートからローカルへ
rsync -avz user@remote.host:/path/to/source/ /local/destination/

# ローカルからリモートへ
rsync -avz /local/source/ user@remote.host:/path/to/destination/

# 非標準ポートのSSH
rsync -avz -e "ssh -p 2222" source/ user@remote.host:/destination/

# SSH鍵を指定
rsync -avz -e "ssh -i ~/.ssh/id_rsa" source/ user@remote.host:/destination/

リモート間の同期

# 2つのリモートホスト間で同期
rsync -avz user1@host1:/source/ user2@host2:/destination/

# プルモデル(リモートから取得)
rsync -avz --delete remote.host::module/path/ /local/path/

高度な同期オプション

削除オプション

ミラーリングを行う際に重要なのが、削除オプションです。これを使うと、送信元と送信先を完全に同じ状態にできますね:

# 送信元にないファイルを送信先から削除
rsync -av --delete source/ destination/

# 削除前に確認(これ重要!)
rsync -av --delete --dry-run source/ destination/

# 削除したファイルをバックアップ
rsync -av --delete --backup --backup-dir=/backup/deleted source/ dest/

⚠️ 注意: --deleteオプションは強力です。必ず--dry-runで確認してから実行しましょう!

除外パターン

同期したくないファイルがある場合は、除外パターンを使いましょう。これは実務でとてもよく使う機能ですね:

# 特定のファイルを除外
rsync -av --exclude='*.tmp' source/ destination/

# 複数のパターンを除外
rsync -av --exclude='*.log' --exclude='*.tmp' --exclude='.git/' source/ dest/

# 除外リストファイルを使用
rsync -av --exclude-from='exclude-list.txt' source/ destination/

# includeとexcludeの組み合わせ
rsync -av --include='*.txt' --exclude='*' source/ destination/

💡 実用例: .gitディレクトリやnode_modules、ログファイルなどは除外することが多いですね。

除外リストファイルの例

# exclude-list.txt の内容
*.log
*.tmp
.git/
node_modules/
.DS_Store
*.swp
cache/

実践的な使用例

バックアップスクリプト

#!/bin/bash
# 日付付きバックアップ
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/daily/$DATE"

# ミラーバックアップ
rsync -avz --delete \
  --exclude='*.tmp' \
  --exclude='cache/' \
  /home/user/data/ \
  "$BACKUP_DIR/"

# ログファイルに記録
rsync -avz --delete --log-file="/var/log/backup-$DATE.log" \
  /home/user/data/ \
  "$BACKUP_DIR/"

Webサイトの同期

# 本番環境への同期(慎重に!)
rsync -avz --delete \
  --exclude='config.php' \
  --exclude='uploads/' \
  --exclude='.env' \
  ./public_html/ \
  user@production:/var/www/html/

# ステージング環境の更新
rsync -avz --delete --dry-run \
  production:/var/www/html/ \
  staging:/var/www/html/

増分バックアップ

# リンクを使った増分バックアップ
CURRENT="/backup/current"
DATE=$(date +%Y%m%d-%H%M%S)
SNAPSHOT="/backup/snapshots/$DATE"

rsync -av --delete \
  --link-dest="$CURRENT" \
  /source/data/ \
  "$SNAPSHOT/"

# シンボリックリンクを更新
rm -f "$CURRENT"
ln -s "$SNAPSHOT" "$CURRENT"

パフォーマンスの最適化

帯域幅制限

# 帯域幅を制限(KB/秒で指定)
rsync -avz --bwlimit=1000 source/ destination/

# 営業時間中は制限、夜間は無制限
if [ $(date +%H) -ge 9 -a $(date +%H) -lt 18 ]; then
  rsync -avz --bwlimit=500 source/ dest/
else
  rsync -avz source/ dest/
fi

並列転送

# ファイルリストを分割して並列実行
find /source -type f | split -n 4

# GNU parallelを使用
find /source -type f | \
  parallel -j 4 rsync -av {} /destination/{/}

# xargsで並列実行
find /source -type f -print0 | \
  xargs -0 -n1 -P4 -I{} rsync -av {} /destination/

チェックサムの活用

# チェックサムベースの比較(サイズと時刻ではなく)
rsync -avc source/ destination/

# 部分的なチェックサム
rsync -av --checksum --ignore-times source/ destination/
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

特殊な使用例

ミラーリング

# 完全なミラー(危険!慎重に使用)
rsync -avz --delete --delete-excluded source/ mirror/

# 安全なミラー(削除は別途確認)
rsync -avz source/ mirror/
rsync -avz --delete --dry-run source/ mirror/ | grep "deleting"

ファイルの移動

# コピー後に送信元を削除
rsync -av --remove-source-files source/ destination/

# ディレクトリ構造も含めて移動
rsync -av --remove-source-files --prune-empty-dirs source/ dest/

フィルタリング

# 最近変更されたファイルのみ
find /source -mtime -7 -type f | \
  rsync -av --files-from=- / /destination/

# 特定サイズ以上のファイルを除外
rsync -av --max-size=100M source/ destination/

# 新しいファイルのみ同期
rsync -av --ignore-existing source/ destination/

🎮 理解度チェック

Q1: rsyncで送信元にないファイルを送信先から削除するオプションは?

rsyncで送信元にないファイルを送信先から削除するオプションは?

Q2: rsyncで転送前に実行内容を確認するオプションは?

rsyncで転送前に実行内容を確認するオプションは?

Q3: rsyncでよく使われる基本的なオプションの組み合わせは?

rsyncでよく使われる基本的なオプションの組み合わせは?

トラブルシューティング

よくある問題と解決策

rsyncを使っていると、いくつかの問題に遭遇することがあります。よくある問題と解決策を見ていきましょう:

# 権限エラーの対処法
# sudoを使用(リモートでも使えます)
rsync -av --rsync-path="sudo rsync" source/ user@host:/destination/

# シンボリックリンクの扱い
rsync -avL source/ destination/  # リンクを辿る
rsync -avl source/ destination/  # リンクをそのままコピー

# 文字コードの問題
rsync -av --iconv=UTF-8,UTF-8 source/ destination/

デバッグとログ

# 詳細なデバッグ情報
rsync -avvv source/ destination/

# 何が転送されるか事前確認
rsync -avn source/ destination/

# 変更内容の詳細表示
rsync -avii source/ destination/
# 出力の意味:
# >f+++++++++ 新規ファイル
# >f.st...... サイズとタイムスタンプが変更
# >d..t...... ディレクトリのタイムスタンプが変更

rsyncデーモンの使用

# /etc/rsyncd.conf の設定例
[backup]
path = /backup
read only = no
auth users = backupuser
secrets file = /etc/rsyncd.secrets

# デーモンへの接続
rsync -av source/ rsync://backupuser@host/backup/

ベストプラクティス

安全な同期のために

  1. 常に--dry-runで確認: 特に--deleteを使用する場合
  2. バックアップの保持: --backupオプションの活用
  3. ログの記録: --log-fileで操作履歴を保存
  4. 除外リストの管理: 重要な設定ファイルは除外

効率的な運用

# エイリアスの設定
alias rsync-backup='rsync -avhP --delete --exclude-from=~/.rsync-exclude'
alias rsync-mirror='rsync -avhP --delete --stats'

# cronでの定期実行
# 毎日2時にバックアップ
0 2 * * * /usr/bin/rsync -avz --delete /data/ /backup/daily/

📝 まとめ

今回はrsyncについて学びました!

rsyncは単なるコピーツールではなく、効率的なファイル同期を実現する強力なツールでしたね。覚えておきたいポイントをまとめます:

  • 差分転送により、変更部分のみを転送して時間を節約できる
  • 基本オプション-avhPを覚えておけば大丈夫
  • --deleteオプションでミラーリングができるが、必ず--dry-runで確認
  • --excludeで不要なファイルを除外して効率的な同期が可能
  • SSH経由でリモートサーバーとも安全に同期できる

rsyncは、バックアップやデプロイメント、開発環境の同期など、さまざまな場面で活躍します。特に大量のファイルを扱う場合や、定期的な同期が必要な場合には欠かせないツールですね。

次はscpコマンドで、より簡単なリモートファイル転送の方法を学んでみましょう!