1. 序章

ファイルの転送、フォルダのバックアップの作成、新しいソフトウェアのインストールなどの管理タスクを実行する場合、柔軟で効率的で安全なツールが必要になることがよくあります。 rsync は、これらすべてのニーズとそれ以上のニーズを満たすことができる多用途のツールであり、効率的に実行できます。 したがって、Linuxシステム管理者またはユーザーがrsyncの使用方法を学ぶことは良い投資です。

このチュートリアルでは、rsyncを使用してファイルとフォルダーを同期する方法を学習します。 ローカルシステムとリモートマシンでこれを行う方法を学習します。

2. サンプルディレクトリ構造

まず、サンプルのディレクトリ構造を作成しましょう。 これを使用して、rsyncコマンドを実行します。

$ mkdir dir1
$ echo test > dir1/file.txt
$ echo test2 > dir1/file2.txt
$ mkdir dir1/nested-dir
$ echo test3 > dir1/nested-dir/file3.txt
$ mkdir dir2

これにより、3つのファイルが作成されます。1つは dir1/内のネストされたディレクトリにあります。 treeコマンドを使用して確認してみましょう。

$ tree
dir1/
├── nested-dir
│ └── file3.txt
├── text-file2.txt
└── text-file.txt

3. ファイルの一覧表示

最初の例として、rsyncを使用してディレクトリ内のファイルを一覧表示できます。 これで、rsyncの出力形式に慣れることができます。

$ rsync dir1/
drwxrwxr-x 4,096 2021/04/04 11:38:24 .
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file.txt
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file2.txt
drwxrwxr-x 4,096 2021/04/04 11:38:24 nested-dir

dir1 / にあるファイルのみが一覧表示され、 dir1 / nested-dir/にあるファイルは無視されます。 rsync がディレクトリを再帰的にウォークするようにするには、-rフラグを使用します。

$ rsync -r dir1/
drwxrwxr-x 4,096 2021/04/04 11:38:24 .
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file.txt
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file2.txt
drwxrwxr-x 4,096 2021/04/04 11:38:24 nested-dir
-rw-rw-r-- 6 2021/04/04 11:38:24 nested-dir/file3.txt

ご了承ください rsyncを使用する場合は、各ディレクトリパスの最後に/を追加することが重要です。 それ以外の場合、rsyncはそれがファイルであると見なします。

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

rsync を使用して、ローカルディレクトリを同期できます。 rsyncの重要な特性は、一方向にのみ機能することです。 したがって、2つのディレクトリを双方向で同期する場合は、次のコマンドを実行する必要があります。 rsync 2回、ディレクトリの順序を変更します。 dir1/dir2/に同期しましょう。

$ rsync -havun dir1/ dir2/

これらのコマンドラインフラグ(h、a、v、u、n)の意味を見てみましょう。

-h フラグは、人間が読める形式の出力を生成します。 -a フラグは、アーカイブモードをアクティブにします。 これは、 -rlptgoD のショートカットです。つまり、次のようになります。

  • (-r)ディレクトリを再帰的にウォーク
  • (-l)シンボリックリンクをシンボリックリンクとしてコピー
  • (-p)権限を保持
  • (-t)変更時間を保持
  • (-g)保存グループ
  • (-D)デバイスと特殊ファイルを保持します

-vフラグは、詳細を出力するために冗長性を高めます。 -uフラグは更新をアクティブにします。 これにより、レシーバーで新しいファイルがスキップされます。 -nフラグはドライランを実行します。 ドライランは同期をシミュレートするだけで、実際には何も同期せずに出力を一覧表示します。 コマンドを実際に実行する前に、何をするかを確認しておくと便利です。

実際の同期操作を実行する前にドライラン(-n)を実行することにより、データ損失の原因となる可能性のあるユーザーエラーを検出できます。 したがって、使用する場合 rsync 、ドライランを行うことは重要な最初のステップです。

コマンドを実行して、出力を確認してみましょう。

$ rsync -havun dir1/ dir2/
sending incremental file list
created directory dir2
./
text-file.txt
text-file2.txt
nested-dir/
nested-dir/file3.txt

これらのファイルが同期したいファイルであることが確実な場合は、 -n フラグを削除して、実際の同期を実行できます。

$ rsync -havu dir1/ dir2/
sending incremental file list
created directory dir2
./
text-file.txt
text-file2.txt
nested-dir/
nested-dir/file3.txt


sent 358 bytes received 111 bytes 938.00 bytes/sec
total size is 16 speedup is 0.03

同期を2回実行すると、rsyncは同期するファイルを検出しません。 したがって、ドライランを再度実行すると、同期用のファイルが出力されないことがわかります。

$ rsync -havun dir1/ dir2/
sending incremental file list


sent 199 bytes received 13 bytes 424.00 bytes/sec
total size is 16 speedup is 0.08 (DRY RUN)

これを使用して、同期が正常に完了したことをテストしたり、ローカルフォルダーとリモートフォルダーを比較したりすることもできます。

5. リモートディレクトリの同期

リモートディレクトリを同期するには、次を使用できます。

$ rsync -havuz dir1/ user@host:~/dir2/

新しいフラグ-zを追加しました。 これは、rsyncが転送中にデータを圧縮することを意味します。 ネットワーク経由でファイルを送信しているため、パフォーマンスが向上します。

rsync を使用して、パラメーターの順序を変更するだけで、リモートフォルダーをローカルフォルダーに同期することもできます。

$ rsync -havuz user@host:~/dir2/ dir1/

設計によるrsyncの制限は、2つのリモートディレクトリを同期できないことです。 したがって、2つのリモートディレクトリを同期するには、他のオプションを検討する必要があります。 最初にローカルシステムに同期するか、最初にリモートシステムの1つにssh接続を作成して、そこから同期を行うことができます。

6. SSH経由でのリモートディレクトリの同期

プロトコルをsshに設定するには、-eフラグを使用できます。

$ rsync -havuz -e ssh dir1/ user@host:~/dir2/

同じ方法を使用して、sshで使用されるポートを設定することもできます。

rsync -havuz -e 'ssh -p 8022' dir1/ user@host:~/dir2/

7. 単一ファイルの同期

rsync を使用して単一のファイルのみを同期する場合は、末尾のスラッシュを使用せずにファイル名を指定できます。

$ rsync -havuz dir1/text-file.txt dir2/

8. 他のフラグの使用

rsync には、フォルダーの同期中に役立つ可能性のある他のフラグもいくつかあります。

8.1. 既存のファイルを無視する

–ignore-existing フラグは、ターゲットディレクトリにないファイルのみを同期します。 試してみよう:

$ rsync -havuz --ignore-existing dir1/ dir2/

8.2. ソースディレクトリにないファイルの削除

–delete フラグを使用して、より厳密な同期を行います。 ソースディレクトリにファイルが存在しない場合は、これを使用してターゲットディレクトリのファイルを削除しましょう。

$ rsync -havuz --delete dir1/ dir2/

8.3. 同期後のソースディレクトリ内のファイルの削除

バックアップの同期などのタスクを実行している場合、ターゲットに正常に転送されたら、ソースディレクトリ内の同期されたファイルを削除することをお勧めします。 これを実現するには、 –remove-source-filesフラグを使用します。

$ rsync -havuz --remove-source-files dir1/ dir2/

8.4. ファイルの包含と除外

–includeおよび–exclude パラメーターを使用して、同期するファイルを決定しましょう。

$ rsync -havuz --include '*.jpg' --exclude '*' dir1/ dir2/

このコマンドには、*。jpgファイルのみが含まれ、他のすべてのファイルは含まれません。

8.5. 転送するファイルの最大サイズの設定

–max-size パラメータを使用して、転送に含めるファイルの最大サイズを設定しましょう。

$ rsync -havuz --max-size='100K' dir1/ dir2/

これは、スクリプトと構成ファイルのみを転送し、大きなバイナリファイルは転送しない場合など、多くの場合に役立ちます。

8.6. 進捗状況の表示

完了までに時間がかかる同期操作の場合、同期の実行中に進行状況を表示したい場合があります。 進行状況インジケーターを追加しましょう:

$ rsync -havuz --progress dir1/ dir2/

8.7. チェックサムの使用

デフォルトでは、 rsync はファイルサイズと最終変更時刻を使用してファイルを比較します。–checksumフラグを使用すると、rsyncはソースファイルとターゲットファイルのチェックサムをさらに比較します。それ’ファイルのサイズと最終変更時間が等しい場合にのみチェックサムを計算します。 これは、データ損失の点ではるかに安全です。 代わりに、追加の計算リソースと少量の追加帯域幅を消費します。

$ rsync -havuz --checksum dir1/ dir2/

9. 結論

この記事では、rsyncコマンドを使用してファイルとディレクトリを同期する方法を学びました。 また、ローカルロケーションとリモートロケーションの両方を同期する方法も学びました。 また、rsyncの動作を変更するためのさまざまなコマンドラインオプションとパラメーターについても学びました。