Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxのrsyncコマンド徹底解説!基本構文・オプション・実用例まとめ

rsync(remote synchronization)は、ローカルストレージ内はもちろん、ネットワーク経由でもファイルを同期できる強力なファイルコピーツールです。

その性能の高さから広く普及しており、ファイルのバックアップ、複数のファイルサーバー間での内容の統一、Webアプリのコードやアセットをサーバーへデプロイする用途などによく使われています。

rsyncは認識できるほぼすべてのファイルをコピーでき、ファイルサイズと更新日時をもとに変更の有無を判断し、更新が必要なファイルだけを効率的に同期します。

rsyncコマンドは非常に多くのオプションを持つ大きなコマンドです。このガイドでは、最もよく使われるシナリオをカバーする実用的な使い方をわかりやすく紹介します。

基本構文

rsync OPTIONS SOURCE DESTINATION

各要素の意味は以下の通りです。

  • OPTIONS: 後述の一覧から選んだオプションをスペース区切りで指定します
  • SOURCE: 同期元のファイルまたはフォルダへのパス。リモートホストの情報を含めることもできます
  • DESTINATION: 同期先のパス。こちらもリモートホストを指定できます
  • SOURCEとDESTINATIONの順序は必ず守ってください!

主なオプション

よく使われるオプションを、マニュアルから抜粋してカテゴリ別に紹介します。

■ 何をコピーするか:

-r, --recursive             ディレクトリを再帰的に処理する
-R, --relative              相対パス名を使用する
    --exclude=PATTERN       PATTERNに一致するファイルを除外する
    --exclude-from=FILE     FILEから除外パターンを読み込む
-I, --ignore-times          サイズとタイムスタンプが一致するファイルも除外しない
    --size-only             転送要否の判定にファイルサイズのみを使用する
    --modify-window=NUM     ファイル比較時のタイムスタンプの許容誤差(秒)(デフォルト=0)
    --include=PATTERN       PATTERNに一致するファイルを除外しない
    --include-from=FILE     FILEから包含パターンを読み込む

■ どうコピーするか:

-n, --dry-run               実際には変更を行わない試験実行をする
-l, --links                 シンボリックリンクをシンボリックリンクとしてコピーする
-L, --copy-links            シンボリックリンクを参照先のファイル/ディレクトリに変換する
    --copy-unsafe-links     「安全でない」シンボリックリンクのみ変換する
    --safe-links            コピー先ツリー外へのリンクを無視する
    --munge-links           シンボリックリンクをより安全な形に変換する
-H, --hard-links            ハードリンクを保持する
    --devices               デバイスファイルを保持する(スーパーユーザーのみ)
    --specials              特殊ファイルを保持する
-D, --devices --specials    デバイスファイル+特殊ファイルを保持する(スーパーユーザーのみ)
-g, --group                 グループを保持する
-o, --owner                 所有者を保持する(スーパーユーザーのみ)
-p, --perms                 パーミッションを保持する
    --remove-source-files   送信側が同期済みファイル(ディレクトリ以外)を削除する
-t, --times                 タイムスタンプを保持する
-S, --sparse                スパースファイルを効率的に扱う
-x, --one-file-system       ファイルシステムの境界を越えない
-B, --block-size=SIZE       チェックサムのブロックサイズを固定する(デフォルト700)
-e, --rsh=COMMAND           rshの代替となるリモートシェルを指定する
    --rsync-path=PATH       リモートマシン上のrsyncのパスを指定する
    --numeric-ids           uid/gid値をユーザー/グループ名にマップしない
    --timeout=SECONDS       IOタイムアウトを秒単位で設定する
-W, --whole-file            ファイル全体をコピーし、差分チェックを行わない

■ コピー先に関するオプション:

-a, --archive               アーカイブモード(-rlptgoDと同等、-H,-A,-Xを除く)
-b, --backup                バックアップを作成する(--suffix・--backup-dir参照)
    --backup-dir=DIR        バックアップを指定ディレクトリに作成する
-z, --compress              転送中にファイルデータを圧縮する
-c, --checksum              更新日時とサイズではなくチェックサムに基づいてスキップする
-C, --cvs-exclude           CVSと同じ方法でファイルを自動的に無視する
    --existing              既に存在するファイルのみ更新する
    --delete                送信側に存在しないファイルを受信側で削除する
    --delete-excluded       除外されたファイルも受信側で削除する
    --delete-after          転送後に削除を実行する(転送中ではなく)
    --force                 空でなくてもディレクトリの削除を強制する
    --ignore-errors         IOエラーがあっても削除を実行する
    --max-delete=NUM        削除するファイル数をNUM以下に制限する
    --log-file-format=FMT   指定した形式でファイル転送をログに記録する
    --partial               転送途中のファイルを保持する
    --progress              転送中の進捗状況を表示する
-P                          --partial --progress と同等
    --stats                 ファイル転送の統計情報を表示する
-T, --temp-dir=DIR          一時ファイルを指定ディレクトリに作成する
    --compare-dest=DIR      DIRを基準にコピー先ファイルとの比較も行う
-u, --update                更新のみ(新しいファイルを上書きしない)

■ その他のオプション:

    --address=ADDRESS       指定したアドレスにバインドする
    --blocking-io           リモートシェルでブロッキングIOを使用する
    --bwlimit=KBPS          I/O帯域幅を制限する(KB/秒)
    --config=FILE           代替のrsyncd.confファイルを指定する(デーモン)
    --daemon                rsyncデーモンとして起動する
    --no-detach             親プロセスからデタッチしない(デーモン)
    --password-file=FILE    デーモンアクセス用パスワードをFILEから取得する
    --port=PORT             代替のrsyncdポート番号を指定する
-f, --read-batch=FILE       バッチファイルを読み込む
-F, --write-batch=FILE      バッチファイルを書き出す
    --version               バージョン番号を表示する
-v, --verbose               出力を詳細にする
-q, --quiet                 出力を簡潔にする
-4, --ipv4                  IPv4を優先する
-6, --ipv6                  IPv6を優先する
-h, --help                  ヘルプ画面を表示する

すべてのオプションを確認したい場合は、次のコマンドでrsyncのユーザーマニュアルを参照してください。

man rsync

実用例

以下では各オプションの意味は繰り返し説明しません。意味が不明な場合は、必ず上記の一覧に戻って確認してください。誤ったコマンドを実行してデータを失わないよう注意しましょう。

ローカル → ローカル(単一ファイル)

ローカルマシン上のあるディレクトリから別のディレクトリへ、単一ファイルを同期する方法です。

rsync -zvh /path/to/my-file.tar /path/to/destination/

以降の例では、rsyncの最も一般的な用途である「ディレクトリ同期」に焦点を当てて解説します。

ローカル → ローカル(ディレクトリ)

同じマシン上のあるディレクトリから別のディレクトリへ、すべてのファイルを同期します。

rsync -avzh /path/to/source /path/to/destination

「-avzh」とは何か?これは複数のオプションを連結して書いたもので、「-a -v -z -h」と個別に指定するよりも手早い書き方です。

ローカル → リモート(ディレクトリ)

ローカルのソースディレクトリから、ネットワーク経由でリモートコンピュータ上の宛先へすべてのファイルを同期します。

rsync -avz /path/to/source/ user@192.168.1.11:/path/at/destination/

注意点:

  • userはリモートシステム上のユーザー名です
  • /path/to/source/はローカルコンピュータ上のソースディレクトリへのパスです
  • 192.168.1.11はリモートシステムのIPアドレスです(IPアドレスまたはホスト名のどちらでも指定できます)
  • /path/at/destination/はリモートファイルシステム上のパスです
  • 同期はrsyncデーモンを使って行われます

SSHを使ったローカル → リモート(ディレクトリ)

-eオプションを使うと、rsyncが使用するプロトコルを指定できます。これにより、SSH経由で安全にファイルを転送できます。

rsync -avzh -e ssh /path/to/source/ user@192.168.1.11:/path/at/destination/

リモート → ローカル(ディレクトリ)

リモートコンピュータ上のソースディレクトリから、ネットワーク経由でローカルコンピュータ上の宛先へすべてのファイルを同期します。

rsync -avzh user@192.168.1.11:/path/to/source /path/to/destination

注意点:

  • userはリモートシステム上のユーザー名です
  • 192.168.1.11はリモートシステムのIPアドレスです(IPアドレスまたはホスト名のどちらでも指定できます)
  • /path/to/sourceはリモートファイルシステム上のパスです
  • /path/to/destinationはローカルコンピュータ上の宛先です
  • 同期はrsyncデーモンを使って行われます

SSHを使ったリモート → ローカル(ディレクトリ)

rsync -avzh -e ssh user@192.168.1.11:/path/to/source /path/to/destination

ディレクトリの場合と同様に、単一ファイルの同期も「ローカル→リモート」「リモート→ローカル」「SSH経由」のいずれの形でも実行できます。

同期時に考慮すべきその他のポイント

帯域幅への配慮

インターネット経由で同期する場合は、ネットワーク上の他のサービスを遅くしないよう、使用する帯域幅を制限するとよいでしょう。

rsync -avz --bwlimit 512 /path/to/source/ user@192.168.1.11:/path/at/destination/

削除の扱い

ソース側でファイルやフォルダが削除されていて、宛先側にまだ残っている場合、宛先側でも削除してソースの完全なミラーにしたいことがあります。ただし、このオプションを使う前に、本当に削除してよいのか必ず確認してください

rsync -avz --delete /path/to/source/ user@192.168.1.11:/path/at/destination/

ファイルの包含・除外

ファイルパターンの一致によって、同期に含めるファイルと除外するファイルを指定できます。同期したくないファイルがある場合は、除外しておきましょう。

rsync -avz -e ssh --exclude '*' --include 'keep*' /path/to/source/ user@192.168.1.11:/path/at/destination/

このrsyncコマンドは、「keep」で始まるファイルとディレクトリのみを同期対象とし、それ以外のすべてのファイル・ディレクトリ(*)を除外します。

ドライラン(試験実行)の活用

ドライランでは、変更される予定のファイルが出力されますが、実際には何も行われません。ファイルが同期されたり変更されたりすることはないため、さまざまなオプションを試してその効果を事前に確認できます。

rsync -avz --dry-run /path/to/source/ user@192.168.1.11:/path/at/destination/

まとめ

システム上で大量のファイルを移動させる際は、Enterキーを押す前に入力内容を必ず確認してください。同期の方向を間違えて、重要なファイルを消してしまうことがないようにしましょう。

Linuxシェルコマンドに関する他の記事も、ぜひ合わせてご覧ください。

  1. Linuxのlsコマンド徹底解説!ファイルとディレクトリを一覧表示する方法

    Linuxのlsコマンドは、多くのユーザーが最初に使うことになる基本コマンドの一つです。この記事では、lsコマンドの基本的な使い方と、実務で頻繁に利用されるオプションについてわかりやすく解説します。 筆者が普段よく使うオプションの組み合わせは以下のとおりです。 ls -Zaltrh それでは、各オプションの意味をひとつずつ掘り下げながら、この組み合わせがなぜ便利なのかを説明していきます。 lsコマンドの基本構文 # ls [OPTION] [FILE] OPTIONS: [-a] 「.」または「..」で始まる隠しエントリを無視しない [-h] -lと併用した場合、サイズを人間が読みやすい形式で

  2. コマンドプロンプト入門:ファイルとフォルダを操作する基本コマンド

    コマンドプロンプト入門:ファイルとフォルダを操作する基本コマンド エクスプローラーを使わずにファイルを操作できたら便利だと思ったことはありませんか?開発者やITエンジニアの方なら、ターミナルでの作業は日常茶飯事でしょう。しかし、開発者でなくても、基本的なコマンドラインの知識は持っておいて損はありません。 このガイドでは、ターミナル作業で役立つ、よく使われるファイル操作コマンドを紹介します。 フォルダ間の移動には「cd」と「dir」 コマンドプロンプト(PowerShell や Windows Terminal でも同様)でファイルシステム内を移動するには、cd と dir という2つの基本コマ