ファイル操作 初級

rsyncコマンド入門 ― ファイルの同期・転送を使いこなす

Linuxのファイル同期コマンド rsync の使い方を、ローカルコピーからリモートサーバーへの転送、バックアップ用途まで段階的に学ぶ。

rsync は「ファイルやディレクトリを効率よく同期・転送する」コマンドです。 変更されたファイルだけを転送する差分転送機能が特徴で、バックアップ・デプロイ・サーバー間のファイル同期など幅広い用途で使われます。


基本構文

rsync [オプション] 転送元 転送先
  • 転送元 / 転送先: ローカルのパス、またはリモートホスト(user@host:/path
  • rsync は差分のみを転送するため、cpscp より高速・効率的です

ステップ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 sshSSH経由で転送(リモート転送時)
--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

ファイルごとのサイズ・転送速度・残り時間が表示されます。


実践例:定期バックアップスクリプト

rsynccron を組み合わせて、自動バックアップを設定できます。

#!/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 で動作確認する習慣をつけると、意図しないファイル操作を防げます。