rsyncコマンド
導入
rsync は、ファイル同期に使用される一般的に使用される Linux アプリケーションです。
ローカル コンピュータとリモート コンピュータ間、または 2 つのローカル ディレクトリ間でファイルを同期できます (ただし、2 台のリモート コンピュータ間の同期はサポートされていません)。また、cp
および mv
コマンドに代わるファイル コピー ツールとしても使用できます。
名前のr
はリモートを指し、rsync は実際にはリモート同期
を意味します。他のファイル転送ツール (FTP や scp など) とは異なり、rsync の最大の特徴は、送信者と受信者の既存のファイルをチェックし、変更された部分のみを転送することです (デフォルトのルールでは、ファイル サイズや変更時刻は変更されません)。変わりました)。
rsync は SSH ツール セットの一部ではありませんが、リモート操作も関係するため、ここで紹介します。
インストール
rsync がローカルまたはリモートコンピューターにインストールされていない場合は、次のコマンドを使用してインストールできます。
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
転送の両側に rsync がインストールされている必要があることに注意してください。
基本的な使い方
rsync を使用すると、ローカルコンピューター上の 2 つのディレクトリ間を同期できます。以下では、例としてローカル同期を使用して、rsync のいくつかの主要パラメータの使用法を説明します。
-r
パラメータ
このマシンで rsync コマンドを使用すると、ソース ディレクトリをターゲット ディレクトリにコピーするための cp
および mv
コマンドの代わりに使用できます。
$ rsync -r source destination
上記のコマンドで、-r
は再帰、つまりサブディレクトリを含むことを意味します。 -r
が必須であることに注意してください。そうしないと、rsync は正常に実行されません。 source
ディレクトリはソース ディレクトリを表し、destination
はターゲット ディレクトリを表します。上記のコマンドを実行すると、ターゲット ディレクトリにサブディレクトリ destination/source
が表示されます。
同期する必要があるファイルまたはディレクトリが複数ある場合は、次のように記述できます。
$ rsync -r source1 source2 destination
上記のコマンドでは、source1
と source2
が destination
ディレクトリに同期されます。
-a
パラメータ
-a
パラメータは -r
の代わりに使用でき、再帰的な同期に加えて、メタ情報 (変更時刻、権限など) も同期できます。 rsync はデフォルトでファイルのサイズと変更時間を使用してファイルを更新する必要があるかどうかを判断するため、-r
よりも-a
の方が便利です。以下のような使い方が一般的な書き方です。
$ rsync -a source destination
宛先ディレクトリdestination
が存在しない場合は、rsync が自動的に作成します。上記のコマンドを実行すると、ソース ディレクトリ source
がターゲット ディレクトリ destination
に完全にコピーされ、destination/source
のディレクトリ構造が形成されます。
ソース ディレクトリ source
の内容をターゲット ディレクトリ destination
に同期するだけの場合は、ソース ディレクトリの後にスラッシュを追加する必要があります。
$ rsync -a source/ destination
上記のコマンドを実行すると、source
ディレクトリの内容が destination
ディレクトリにコピーされ、destination
の下に source
サブディレクトリは作成されません。
-n
パラメータ
rsync の実行後にどのような結果が生成されるかわからない場合は、まず -n
または --dry-run
パラメータを使用して実行結果をシミュレートします。
$ rsync -anv source/ destination
上記のコマンドで、-n
パラメータはコマンドの実行結果をシミュレートするものであり、実際にコマンドを実行するわけではありません。 -v
パラメータは結果を端末に出力するので、どのコンテンツが同期されるかを確認できます。
--delete
パラメータ
デフォルトでは、rsync は単にソース ディレクトリのすべての内容 (明示的に除外されたファイルを除く) がターゲット ディレクトリにコピーされることを保証します。 2 つのディレクトリはそのまま残されず、ファイルも削除されません。ターゲット ディレクトリをソース ディレクトリのミラー コピーにしたい場合は、--delete
パラメータを使用する必要があります。これにより、ソース ディレクトリではなくターゲット ディレクトリにのみ存在するファイルが削除されます。
$ rsync -av --delete source/ destination
上記のコマンドでは、--delete
パラメータによりdestination
がsource
のミラーになります。
ファイルを除外する
--exclude
パラメータ
同期中に特定のファイルまたはディレクトリを除外したい場合があります。この場合、--exclude
パラメータを使用して除外モードを指定できます。
$ rsync -av --exclude='*.txt' source/ destination
# 或者
$ rsync -av --exclude '*.txt' source/ destination
上記のコマンドはすべての TXT ファイルを除外します。
rsync はドット
で始まる隠しファイルを同期することに注意してください。隠しファイルを除外したい場合は、次のように --exclude=".*"
と記述します。
ディレクトリ内のすべてのファイルを除外したいが、ディレクトリ自体は除外したくない場合は、次のように記述できます。
$ rsync -av --exclude 'dir1/*' source/ destination
複数の除外モードの場合、複数の --exclude
パラメータを使用できます。
$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
複数の除外パターンでは、--exclude
パラメータのみを使用して、Bash の大規模拡張機能を利用することもできます。
$ rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
多数の除外パターンがある場合は、パターンごとに 1 行ずつファイルに書き込み、このファイルを --exclude-from
パラメーターで指定できます。
$ rsync -av --exclude-from='exclude-file.txt' source/ destination
--include
パラメータ
--include
パラメータは、同期する必要があるファイル モードを指定するために使用され、多くの場合、--exclude
と組み合わせて使用されます。
$ rsync -av --include="*.txt" --exclude='*' source/ destination
上記のコマンドは、同期時にすべてのファイルが除外され、TXT ファイルが含まれることを指定します。
リモート同期
SSH プロトコル
rsync は、2 つのローカル ディレクトリ間の同期をサポートするだけでなく、リモート同期もサポートします。ローカル コンテンツをリモート サーバーに同期できます。
$ rsync -av source/ username@remote_host:destination
リモート コンテンツをローカルで同期することもできます。
$ rsync -av username@remote_host:source/ destination
rsync は、リモート ログインとデータ転送にデフォルトで SSH を使用します。
rsync は初期の頃は SSH プロトコルを使用していなかったので、-e
パラメータでプロトコルを指定する必要がありましたが、これは後に変更されました。したがって、以下では -e ssh
は省略できます。
$ rsync -av -e ssh source/ user@remote_host:/destination
ただし、ssh コマンドに追加のパラメータがある場合は、実行する SSH コマンドを指定するために-e
パラメータを使用する必要があります。
$ rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
上記のコマンドでは、-e
パラメータは、SSH がポート 2234 を使用することを指定します。
rsync プロトコル
SSH の使用に加えて、別のサーバーに rsync デーモンがインストールされ実行されている場合は、rsync://
プロトコル (デフォルトのポート 873) を使用して転送することもできます。具体的な記述方法は、サーバーと対象ディレクトリの間をダブルコロンで区切る::
です。
$ rsync -av source/ 192.168.122.32::module/destination
上記のアドレスのmodule
は実際のパス名ではなく、rsync デーモンによって指定され、管理者によって割り当てられたリソース名であることに注意してください。
rsync デーモンによって割り当てられたすべてのモジュールのリストを知りたい場合は、次のコマンドを実行できます。
$ rsync rsync://192.168.122.32
rsync プロトコルで二重コロンを使用するほかに、rsync://
プロトコルを直接使用してアドレスを指定することもできます。
$ rsync -av source/ rsync://192.168.122.32/module/destination
増分バックアップ
rsync の最大の特徴は、増分バックアップを完了できることです。つまり、デフォルトでは変更されたファイルのみがコピーされます。
ソース ディレクトリとターゲット ディレクトリ間の直接比較に加えて、rsync はベース ディレクトリの使用もサポートします。つまり、ソース ディレクトリとベース ディレクトリ間の変更はターゲット ディレクトリに同期されます。
具体的な方法としては、最初の同期は完全バックアップであり、すべてのファイルがベース ディレクトリで同期されます。以降のすべての同期は増分バックアップとなり、ソース ディレクトリとベース ディレクトリの間で変更された部分のみが同期され、この部分は新しいターゲット ディレクトリに保存されます。この新しいターゲット ディレクトリにはすべてのファイルも含まれていますが、実際には、このディレクトリには変更されたファイルのみが存在し、変更されていない他のファイルはベース ディレクトリ ファイルを指すハード リンクです。
--link-dest
パラメータは、同期中にベース ディレクトリを指定するために使用されます。
$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上記のコマンドでは、--link-dest
パラメータでベース ディレクトリ /compare/path
を指定し、ソース ディレクトリ /source/path
をベース ディレクトリと比較して、変更されたファイルを見つけてコピーします。ターゲットディレクトリ/target/path
に移動します。変更されていないファイルはハード リンクを生成します。このコマンドの最初のバックアップは完全バックアップであり、それ以降のバックアップは増分バックアップです。
以下は、ユーザーのホーム ディレクトリをバックアップするスクリプトの例です。
#!/bin/bash
# rsync を使用して増分バックアップを実行するスクリプト
set -o errexit
set -o nounset
set -o pipefail
readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"
mkdir -p "${BACKUP_DIR}"
rsync -av --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
`${BACKUP_PATH}`
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
上記のスクリプトでは、同期ごとに新しいディレクトリ ${BACKUP_DIR}/${DATETIME}
が生成され、ソフト リンク ${BACKUP_DIR}/latest
がこのディレクトリを指します。次回のバックアップ中に、${BACKUP_DIR}/latest
をベース ディレクトリとして使用して、新しいバックアップ ディレクトリを生成します。最後に、ソフト リンク ${BACKUP_DIR}/latest
を新しいバックアップ ディレクトリに指定します。
設定項目
-a
および --archive
パラメータはアーカイブ モードを示し、変更時刻 (変更時刻)、権限、所有者などのすべてのメタデータを保存し、ソフト リンクも同期されます。
--append
パラメータは、ファイルが最後に中断された場所から転送を続行することを指定します。
--append-verify
パラメータは--append
パラメータと似ていますが、転送の完了後にファイルを検証します。検証が失敗した場合は、ファイル全体が再送信されます。
-b
および --backup
パラメータは、ターゲット ディレクトリにすでに存在するファイルを削除または更新するときに、そのファイルが名前変更された後にバックアップされることを指定します。デフォルトの動作は削除です。名前変更ルールは、--suffix
パラメータで指定されたファイル接尾辞を追加することです。デフォルトは ~
です。
--backup-dir
パラメータは、--backup-dir=/path/to/backups
のように、バックアップ中にファイルが保存されるディレクトリを指定します。
--bwlimit
パラメータは、--bwlimit=100
のように、帯域幅制限を指定します。デフォルトの単位は KB/s です。
-c
および --checksum
パラメータは、rsync
の検証方法を変更します。デフォルトでは、rsync はファイル サイズと最終変更日が変更されたかどうかのみをチェックし、変更された場合は再送信します。このパラメータを使用した後は、ファイルの内容のチェックサムを判断して再送信するかどうかを決定します。
--delete
パラメータは、ターゲット ディレクトリにのみ存在し、ソース ターゲットには存在しないファイルを削除します。これにより、ターゲット ディレクトリがソース ターゲットのミラーになることが保証されます。
-e
パラメータは、データ転送に SSH プロトコルの使用を指定します。
--exclude
パラメータは、--exclude="*.iso"
など、同期されていないファイルを除外することを指定します。
--exclude-from
パラメータはローカル ファイルを指定します。このファイルには、除外する必要があるファイル パターンがパターンごとに 1 行ずつ含まれています。
--existing
および --ignore-non-existing
パラメータは、ターゲット ディレクトリに存在しないファイルとディレクトリを同期しないことを示します。
-h
パラメータは、人間が読める形式での出力を示します。
-h
および --help
パラメータはヘルプ情報を返します。
-i
パラメータは、出力ソース ディレクトリとターゲット ディレクトリ間のファイルの差異の詳細を示します。
--ignore-existing
パラメータは、ファイルがターゲット ディレクトリにすでに存在する限り、そのファイルはスキップされ、これらのファイルは同期されなくなることを意味します。
--include
パラメータは、同期中に含めるファイルを指定し、通常は --exclude
と組み合わせて使用されます。
--link-dest
パラメータは、増分バックアップのベース ディレクトリを指定します。
-m
パラメータは、空のディレクトリを同期しないように指定します。
--max-size
パラメータは、200KB 以下 (--max-size='200k'
) など、送信の最大ファイル サイズ制限を設定します。
--min-size
パラメータは、転送する最小ファイルのサイズ制限を設定します (たとえば、10KB 以上 (--min-size=10k
))。
-n
パラメータまたは --dry-run
パラメータは、実際に実行することなく、実行される操作をシミュレートします。 -v
パラメータとともに使用すると、どのコンテンツが同期されるかを確認できます。
-P
パラメータは、--progress
パラメータと --partial
パラメータの組み合わせです。
--partial
パラメータを使用すると、中断された転送を再開できます。このパラメータを使用しない場合、rsync
は転送中に中断されたファイルを削除します。このパラメータを使用すると、途中で転送されたファイルもターゲット ディレクトリに同期され、中断された転送が再開されます。次の同期中に。通常、--append
または--append-verify
と組み合わせて使用する必要があります。
--partial-dir
パラメータは、転送されたファイルの半分を一時ディレクトリに保存することを指定します (たとえば、--partial-dir=.rsync-partial
)。通常、--append
または--append-verify
と組み合わせて使用する必要があります。
--progress
パラメータは表示の進行状況を示します。
-r
パラメータは再帰、つまりサブディレクトリを含むことを意味します。
--remove-source-files
パラメータは、送信が成功した後に送信者のファイルが削除されることを示します。
--size-only
パラメータは、ファイル変更時間の違いに関係なく、サイズが変更されたファイルのみが同期されることを示します。
--suffix
パラメータは、ファイル名をバックアップするときにファイル名に追加されるサフィックスを指定します。デフォルトは ~
です。
-u
および --update
パラメータは、ターゲット ディレクトリ内の更新時刻を持つファイルが同期中にスキップされること、つまり、更新されたタイムスタンプを持つファイルは同期されないことを示します。
-v
パラメータは出力の詳細を示します。 -vv
はより詳細な情報を出力することを意味し、 -vvv
は最も詳細な情報を出力することを意味します。
--version
パラメータは rsync のバージョンを返します。
-z
パラメータは、同期中のデータ圧縮を指定します。
参考リンク
- How To Use Rsync to Sync Local and Remote Directories on a VPS, Justin Ellingwood
- Mirror Your Web Site With rsync, Falko Timme
- Examples on how to use Rsync, Egidio Docile
- How to create incremental backups using rsync on Linux, Egidio Docile
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0