24.

rsync 完全ガイド — ファイル/ディレクトリ同期の決定版 (SSH/cron/exclude/dry-run)

編集
この記事の要点
  • 基本: rsync -av src/ dst/ で同期。末尾スラッシュの有無で挙動が変わる (src/ は中身、src は ディレクトリごと)
  • SSH 経由: rsync -avz src/ user@host:/path/ でリモート同期、-z は転送時圧縮
  • 差分のみ転送: cp と違い、変更されたファイルのみコピー。大量ファイルのバックアップで爆速
  • 便利オプション: --delete (削除も同期) / --exclude="*.log" (除外) / --dry-run (リハーサル) / -P (進捗 + 部分再開)
  • cron でバックアップ運用が定番、Windows 側は WSL2 か DeltaCopy / cwRsync

rsync とは

rsync (remote sync) は差分のみを高速転送するファイル同期ツールです。ローカル間 / SSH 経由のリモート間、どちらでも使えます。バックアップ・デプロイ・大量ファイルのミラーリングで cpscp よりも圧倒的に速く、中断時の再開やパーミッション保持・除外パターン指定ができます。

# インストール
sudo apt install -y rsync       # Debian/Ubuntu
sudo yum install -y rsync       # RHEL
brew install rsync              # macOS (標準は古い 2.x, brew で 3.x 推奨)

# バージョン確認
rsync --version

基本: ローカル間の同期

# src の中身を dst の中身として同期 (末尾スラッシュ重要)
rsync -av src/ dst/

# src というディレクトリごと dst の下にコピー
rsync -av src dst/
# → dst/src/... が出来る

# よく使うオプション組み合わせ
rsync -avh --progress src/ dst/
# -a : アーカイブモード (-rlptgoD と同等)
# -v : verbose
# -h : human-readable サイズ
# --progress : 進捗表示

末尾スラッシュの罠

コマンド結果
rsync -av src/ dst/src の中身を dst の下にコピー (dst/file1, dst/file2 ...)
rsync -av src dst/src というディレクトリごとコピー (dst/src/file1 ...)
rsync -av src dstdst が存在しなければ dst を作って中身を入れる

主要オプション

オプション意味
-aアーカイブモード (再帰 + パーミッション/タイムスタンプ保持)
-v詳細表示
-z転送時に圧縮 (SSH/低速回線で有効)
-P--partial --progress 相当 (部分再開 + 進捗)
--delete送信元にないファイルを送信先からも削除
--dry-run / -n実行せず動作を表示
--exclude=PAT除外パターン
--exclude-from=FILE除外パターンをファイルから
--include=PAT除外を上書きして含める
--bwlimit=KB帯域制限 (KB/s)
-e sshSSH 経由 (3.x ではデフォルト)
--checksumサイズ/時刻でなくチェックサムで比較
--link-dest=DIR差分ハードリンク (世代バックアップ)

SSH 経由のリモート同期

# ローカル → リモート (アップロード)
rsync -avz -P src/ user@host:/var/www/app/

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

# SSH ポート / 鍵を指定
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" src/ user@host:/path/

# rsync デーモン経由 (高速 LAN 内バックアップ向け)
rsync -av rsync://host/module/ ./dest/

除外と包含 (exclude / include)

# 単発除外
rsync -av --exclude='*.log' --exclude='tmp/' src/ dst/

# パターンを外部ファイルから
cat > /tmp/exclude.list <

--delete: 削除も同期

送信元から削除されたファイルを送信先からも削除するには --delete を付けます。取り扱い注意 (意図しない巻き添え削除を防ぐため --dry-run でリハーサル必須):

# 危険: 必ず --dry-run で確認してから本番
rsync -av --delete --dry-run src/ dst/
# 出力で deleting xxx が想定通りなら実行
rsync -av --delete src/ dst/

# 削除をログに記録
rsync -av --delete --log-file=/var/log/rsync.log src/ dst/

# 削除しすぎ防止: --max-delete
rsync -av --delete --max-delete=10 src/ dst/  # 10件超なら abort

cp との違い (差分のみ転送)

項目cprsync
差分転送毎回全コピー変更分のみ (タイムスタンプ + サイズで比較)
大量ファイル時の速度遅い2 回目以降は爆速
中断後の再開最初から-P で部分再開
SSH 経由不可標準対応
除外指定find と組み合わせ必要--exclude 一発
パーミッション/timestampオプション要-a で全保持

cron で定期バックアップ

# crontab -e で編集
# 毎日 3:00 に DB ダンプ + ファイルをバックアップ
0 3 * * * /usr/bin/rsync -az --delete /var/www/ backup@nas:/backup/web/ >> /var/log/rsync.log 2>&1

# 1 時間ごとに静的サイトをミラー
0 * * * * /usr/bin/rsync -az --exclude='*.tmp' /home/site/ user@mirror:/srv/site/

# 世代バックアップ (hard link で容量節約)
#!/bin/bash
DATE=$(date +%Y%m%d)
rsync -a --delete --link-dest=/backup/latest /var/www/ /backup/$DATE/
ln -snf /backup/$DATE /backup/latest

帯域制限と進捗表示

# 1000 KB/s (= 約 8 Mbps) に制限
rsync -avz --bwlimit=1000 src/ user@host:/path/

# 進捗表示
rsync -avz -P src/ dst/
# sending incremental file list
# foo.zip
#       1,234,567  45%   12.34MB/s    0:00:05  (xfr#1, to-chk=10/15)

# 統計サマリ
rsync -avz --stats src/ dst/
# Number of files: 100
# Total file size: 50,000 bytes
# Total transferred file size: 5,000 bytes
# Speedup is 10.0

Windows での利用

方法説明
WSL2 + rsync (最推奨)sudo apt install rsync で Linux と同じ操作
cwRsyncWindows ネイティブの rsync ポート
DeltaCopycwRsync を GUI 化、Windows サービスとして常駐可能
CygwinCygwin パッケージマネージャから rsync 追加

FAQ

Q: rsync と scp はどう違う?
A: scp は単純な SSH コピー (全コピー)。rsync は差分転送・部分再開・除外パターン対応。大量ファイルや 2 回目以降の同期では rsync が圧倒的に速い

Q: 「same as the source」と言われ転送されない
A: タイムスタンプ + サイズが一致しているため。強制再転送は --checksum (時間かかる) または --ignore-times

Q: Permission denied エラー
A: 送信先に書き込み権限がない / SSH 鍵が違う。--rsync-path="sudo rsync" で sudo 実行も可能。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ls ファイル/ディレクトリ一覧表示
  2. sudo ユーザー指定
  3. cron/crontab ジョブの自動実行と登録方法
  4. wget http通信によるファイルダウンロード
  5. rm ファイル/ディレクトリ削除
  6. pwd カレントディレクトリの表示
  7. cd ディレクトリの移動
  8. ./configure
  9. make
  10. make install
  11. unzip ファイルの解凍
  12. mv ファイル/ディレクトリの移動および名称変更
  13. mkdir ディレクトリの作成
  14. touch 空ファイルの新規作成
  15. vi テキストディタの使用
  16. find ファイル/ディレクトリ検索
  17. grep 文字列の検索
  18. tail ファイルの末尾表示
  19. curl HTTP通信によるリクエスト
  20. nslookup ドメインのIP解決
  21. apt update パッケージリストの情報を更新
  22. apt upgrade パッケージの更新
  23. ln リンク/ショートカットの作成と削除
  24. rsync ファイル/ディレクトリの同期
  25. ssh リモートとの暗号化通信
  26. scp sshを利用したファイルのコピー
  27. unzip zip ファイルを解凍する
  28. cp ファイル/ディレクトリのコピー
  29. diffファイルの差分抽出
  30. fdisk ハードディスクに対する操作
  31. lsblk デバイスをツリー状で表示する
  32. kill プロセスを終了させる
  33. zip ファイルやディレクトリをzip形式に圧縮する
  34. host ドメインからIPアドレスを確認
  35. chmod 権限の変更
  36. ip IPアドレスの確認
  37. chown ファイル/ディレクトリ所有者の変更
  38. chgrp ファイル/ディレクトリのグループ情報の変更
  39. nohupと'&' プログラムのバックグラウンド実行(ssh接続時)
  40. lsof 開いているポート番号の確認
  41. tar ファイルの圧縮と解凍
  42. file ファイルの種類を表示
  43. cat ファイルの中身を表示
  44. head ファイルの先頭部分を表示
  45. wc 行数/単語数/文字数を確認
  46. shutdown システムのシャットダウンと再起動
  47. ps プロセスの確認
  48. which コマンドの絶対パスを調べる
  49. yum RedHat系ディストリビューションの管理
  50. mount ファイルシステムのマウント
  51. 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
  52. 特定のフォルダとそのサブフォルダ内にある特定のファイル名のファイルを再帰的に削除