Linux入門:コマンド操作のきほん

rsync で効率的に同期

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

rsync で効率的に同期 とは

rsyncコマンドで、効率的にファイルやディレクトリを同期する方法を体験します。本レッスンでは、rsync で効率的に同期 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

rsync が解く問題

rsync はファイルやディレクトリを 差分転送 で同期するコマンドです。送信元と送信先を比較し、変更があった部分だけを転送するため、巨大なディレクトリを何度も同期する場合に scp よりも圧倒的に高速・低帯域です。バックアップ、デプロイ、開発機⇔本番のミラーリングなど、Linux 系の運用では事実上の標準ツールになっています。

本コースの実行環境ではリモート同期は試せませんが、rsync はローカルディレクトリ同士の同期にも使えるので、構文と挙動はそのまま手元で学べます。本レッスンでは構文・図解・代替練習を扱います。

基本構文

ターミナル

rsync [オプション] コピー元 コピー先

リモートを使う場合は scp と同じく ユーザー@ホスト:パス で指定します。

ターミナル

# ローカル → ローカル rsync -av src/ dst/ # ローカル → リモート rsync -av --delete dist/ deploy@example.com:/var/www/myapp/ # リモート → ローカル rsync -av deploy@example.com:/var/log/myapp/ ./logs/

よく使うオプション

オプション役割
-aアーカイブモード (-rlptgoD 相当、メタ情報を保ったまま再帰コピー)
-v詳細出力
-z転送中に圧縮
-h数値を読みやすい単位で表示
--delete送信先のみに存在するファイルを削除
--dry-run実行せずに動作を確認
--excludeパターンを除外
-P進捗表示 + 中断ファイルの再開

図解 差分転送の仕組み

diagram (will load when visible)

rsync は単にファイルの有無を見るだけでなく、必要に応じてファイル内部をブロック単位で分割して チェックサム を比較し、変わったブロックだけを送るアルゴリズムを持っています。大きなログファイルが少しだけ追記された場合などに効きます。

末尾スラッシュの罠

rsync で最も間違いやすいのが「コピー元末尾のスラッシュの有無」です。

ターミナル

# src ディレクトリの中身を dst の中に同期 rsync -av src/ dst/ # 結果 dst/file1, dst/file2 ... # src ディレクトリ自体を dst の下に作成して同期 rsync -av src dst/ # 結果 dst/src/file1, dst/src/file2 ...

末尾スラッシュ無しはディレクトリごとコピー、スラッシュ有りは中身だけコピーです。scp -r よりも厳密に区別されるので、--dry-run で必ず確認しましょう。

--delete に注意

ターミナル

rsync -av --delete src/ dst/

--delete は「送信元に無いファイルを送信先から削除する」フラグで、本物のミラーリングをするときに必要です。ただし、コピー元のパスを間違えると 大量のファイルを削除する破壊的操作 になります。本番環境で初めて使う前には必ず --dry-run を付けます。

rsync --delete は本気で危険です。コマンドを書いたあと最低 1 回は --dry-run を付けて出力を目視し、削除対象が想定通りかを確認してから本番投入してください。

進捗を見ながら転送する

ターミナル

rsync -avhP src/ deploy@example.com:/var/data/ # sending incremental file list # big.log # 1.20G 35% 120MB/s 0:00:05 # ...

-P--partial --progress を合わせたもので、転送が途中で切れても次回続きから再開できる便利オプションです。

除外パターン

ターミナル

rsync -av --exclude='*.log' --exclude='node_modules' src/ dst/

--exclude-from=ignore.txt で外部ファイルから読み込ませることもでき、.gitignore 的に使えます。

SSH をどう指定するか

rsync はデフォルトで SSH を利用してリモートに接続します。鍵やポートを変えたい場合は -e でラッパーコマンドを指定します。

ターミナル

rsync -av -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' src/ deploy@example.com:/tmp/

scprsync のどちらを使うか迷ったら rsync を選ぶのがおすすめです。差分転送に加え、進捗表示・再開・除外・ミラーリングまでひとつのコマンドでまかなえます。

ローカル代替練習

本コースの executor 環境ではリモート不可ですが、ローカルディレクトリ同士の同期はそのまま試せます。

ターミナル

mkdir -p /tmp/src /tmp/dst echo hello > /tmp/src/a.txt echo world > /tmp/src/b.txt # 初回 同期 rsync -av /tmp/src/ /tmp/dst/ # 中身を変更 echo updated > /tmp/src/a.txt # 2 回目 差分のみ転送 rsync -av /tmp/src/ /tmp/dst/

2 回目の出力には a.txt だけが現れ、変更されていない b.txt は転送されません。これが差分転送の威力です。

バックアップに使う

日次のディレクトリバックアップにも頻出します。

ターミナル

rsync -av --delete \ --exclude='/var/cache' \ /home/ /backup/$(date +%F)/home/

ハードリンクを使った --link-dest で「世代バックアップ」を最小ディスクで作る、というテクニックも有名です。

まとめ

  • rsync は差分転送ができるファイル同期ツール
  • 基本は rsync -av src/ dst/。末尾スラッシュの有無に注意
  • --delete は強力かつ破壊的。--dry-run で必ず確認
  • -P で進捗・再開、-z で圧縮、--exclude で除外
  • ローカル同期にも使えるので、まず手元で挙動を確かめると安心
  • リモートでは scp より rsync を選ぶのが多くのケースで正解

次のレッスン

次は ネットワークチェック で、rsyncコマンドで、効率的にファイルやディレクトリを同期する方法を体験します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. rsync の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. rsync とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

参考リンク