ネットワーク・通信

Linux rsyncコマンド入門|ファイルを効率的に同期・転送する

Linux rsync ネットワーク

Linux rsyncコマンド入門
ファイルを効率的に同期・転送する

rsyncは、ファイルやディレクトリを効率的に同期・転送するコマンドです。変更があった部分だけを転送する差分同期により、高速なバックアップやデプロイが可能です。

こんな人向けの記事です

  • サーバー間でファイルを効率的に同期したい人
  • 定期バックアップの仕組みを構築したい人
  • 大量のファイルを高速に転送したい人

Step 1rsyncの基本的な使い方

rsyncの基本構文は rsync [オプション] 送信元 送信先 です。

ターミナル
# ローカルのディレクトリ同期
rsync -av /source/ /destination/

# 進捗表示付き
rsync -av --progress /source/ /destination/
末尾のスラッシュに注意

/source/(スラッシュあり)はディレクトリの中身を転送します。/source(スラッシュなし)はディレクトリ自体を転送します。結果が大きく変わるので注意してください。

Step 2よく使うオプション

rsyncの主要なオプション一覧です。

オプション説明
-aアーカイブモード(パーミッション・所有者等を保持)
-v詳細表示(転送ファイル名を表示)
-z転送データを圧縮
-nドライラン(実際には実行しない)
--delete送信元にないファイルを送信先から削除
--progress転送の進捗を表示
--exclude特定のファイル・ディレクトリを除外
-e sshSSH経由で転送(デフォルト)
-av はお決まりの組み合わせ

rsync -av(archive + verbose)は、ファイル属性を保持しつつ転送状況を表示する、最も基本的で頻繁に使われる組み合わせです。

Step 3リモートサーバーとの同期

rsyncはSSH経由でリモートサーバーとファイルを同期できます。

ターミナル
# ローカル → リモート(アップロード)
rsync -avz ./project/ username@hostname:/var/www/html/

# リモート → ローカル(ダウンロード)
rsync -avz username@hostname:/var/log/ ./logs/

# ポートを指定
rsync -avz -e "ssh -p 2222" ./data/ username@hostname:/backup/

# SSH configの名前で接続
rsync -avz ./deploy/ myserver:/var/www/html/

Step 4除外パターンの指定

不要なファイルを転送対象から除外できます。

ターミナル
# 特定のファイル・ディレクトリを除外
rsync -av --exclude='node_modules' --exclude='.git' ./project/ /backup/

# 除外パターンをファイルから読み込み
rsync -av --exclude-from='exclude.txt' ./project/ /backup/

# exclude.txt の例:
# node_modules/
# .git/
# *.log
# .env

Step 5バックアップへの活用

rsyncの差分転送を活かしたバックアップ設定です。

ターミナル
# 完全ミラーリング(送信元と完全に一致させる)
rsync -av --delete /source/ /backup/

# ドライランで確認してから実行
rsync -avn --delete /source/ /backup/   # 確認
rsync -av --delete /source/ /backup/    # 実行

# cronで定期バックアップ
# crontab -e で以下を追加
# 0 2 * * * rsync -av --delete /data/ /backup/data/
--delete は必ずドライランで確認

--delete オプションは送信先のファイルを削除します。必ず -n(ドライラン)で削除対象を確認してから実行しましょう。

Step 6実践的な活用例

実務でよく使うrsyncのパターンです。

ターミナル
# Webサイトのデプロイ
rsync -avz --delete --exclude='.env'   ./dist/ myserver:/var/www/html/

# サーバーのログ収集
rsync -avz myserver:/var/log/nginx/ ./logs/nginx/

# 大量のファイルを帯域制限付きで転送
rsync -avz --bwlimit=10000 ./data/ myserver:/backup/

# 転送後にパーミッションを設定
rsync -avz --chmod=D755,F644 ./web/ myserver:/var/www/
rsync vs scp
  • rsync:差分転送、除外パターン、--deleteなど高機能。大量ファイル向き
  • scp:シンプルな転送。少数ファイルの単発転送向き

定期的な同期やデプロイには rsync を使いましょう。