Linux / コマンド / rsync - ファイル・ディレクトリの変更分同期

rsyncはローカルまたはリモートの場所の間でファイルをコピーし、変更された項目を効率的に同期します。大量のデータの反復送信に便利ですが、対象パスや削除オプションを誤って指定するとデータが失われる可能性があります。

基本的にサイズと修正時刻を比較して送信対象を選びます。-aは再帰コピーと主要なメタデータ保持をまとめたアーカイブモードです。source/はディレクトリの内容を、sourceはディレクトリ自体を宛先にコピーするという違いが重要です。SSH方式のリモートパスはユーザー@ホスト:パスで書きます。

基本的な文法

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

インストールされている実装とオプションは、配布版によって異なる場合があります。man rsyncで現在のシステムの説明を確認してください。

使用例

実際の変更前にプレビュー

手元にproject/を用意し、backup/を事前に作成して保存先と空き容量を確認します。--dry-runはファイル転送・削除を行わず、予定を確認するための指定です。対象パスと範囲を確認してから、次の実行例では同オプションだけを外します。 関連する条件と手順は、tar 圧縮・バックアップと復元の検証を参照できます。 関連する条件と手順は、サーバーのバックアップと状態チェックの自動化構成を参照できます。

rsync -av --dry-run project/ backup/project/

ローカルディレクトリ同期

元のディレクトリ内の内容を対象にコピーします。

rsync -av project/ backup/project/

SSHでリモート転送

SSH方式では両側でrsyncが必要です。接続先のアカウント・パスは実際の値に置き換え、SSHのホストキー確認と接続を済ませてください。

rsync -av project/ alice@server.example.com:/home/alice/project/

実際にコピーする前のプレビュー

rsync --dry-run は変更予定のファイル一覧を表示しますが、データは実際にはコピーされません。末尾のスラッシュの有無によって、対象に作成されるディレクトリ構造が変わります。

rsync -av --dry-run source/ backup/

source/ の中に notes.txt があり、対象に存在しない場合の例示出力:

sending incremental file list
notes.txt

このコマンドは source ディレクトリ自体ではなく、その中身を backup/ に同期することを意味します。--delete を追加すると、対象にのみ存在するファイルが削除される可能性があるため、必ず --dry-run の結果を確認してください。実際に実行後は、ファイル数・サイズやチェックサムで重要ファイルを確認します。

-a は再帰コピーと一部のメタデータ保持をまとめますが、ACL(アクセス制御リスト)・拡張属性・ハードリンクなどすべての属性を常に保存する完全なバックアップオプションではありません。必要な属性は、対象ファイルシステムと権限を確認した後、別途オプションで指定してください。同期結果が重要な場合は、対象での復元試験も行う必要があります。

主なオプションと形式

オプション・形式 説明
-a 再帰コピーと主要な属性保持をまとめたアーカイブモードです。
-v 処理項目を詳細に表示します。
-n, --dry-run 実際の変更なしで作業計画を出力します。
--delete 元にない対象ファイルを削除します。必ず事前に確認が必要です。
--exclude=パターン 指定したパターンのファイルを送信から除外します。
-e 'ssh -p ポート' リモートシェルコマンドとポートを指定します。

使用する際の注意点

--deleteは同期対象のディレクトリで、コピー元にない宛先ファイルを削除します。フィルターは削除対象にも影響するため、実行予定と同じパス・オプションに--dry-runを付け、削除リストまで確認します。単純な同期は誤削除や破損も反映するため、復元用に世代を残すバックアップも別途検討してください。

よくある質問

rsyncでsourceとsource/はどう違いますか?

通常の既存の宛先ディレクトリへのコピーでは、source/は中身を宛先へコピーし、sourceはsourceというディレクトリを宛先の下へコピーします。元データを移動・削除する意味ではありません。

公式ドキュメント

オプションの正確な動作と実装ごとの差は、rsync関連公式ドキュメントで確認できます。