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

上記のコマンドでは、source1source2destination ディレクトリに同期されます。

-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パラメータによりdestinationsourceのミラーになります。

ファイルを除外する

--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 パラメータは、同期中のデータ圧縮を指定します。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0