【Linux】rsyncコマンドを使用してデータ同期する方法

rsyncコマンドで対象ディレクトリーと他のディレクトリーのデータを同期する方法
この記事を読むと・・・
コピー元の状態とコピー先の差分をコピーする方法が理解できる
指定したファイルやディレクトリをコピーする方法が理解できる
目次

rsyncコマンド基本オプション

基本的なオプションは以下の表の通りです。

短縮オプションオプション説明
-r–recursiveディレクトリを再帰的に処理する
-l–linksシンボリックリンクをシンボリックリンクのままコピーする
-p–permsパーミッション情報を保持する
-t–timesタイムスタンプ情報を保持する
-g–group所有グループ情報をそのまま保持する
-o–owner所有者情報をそのまま保持する※自分以外の所有者情報を保持するにはroot権限が必要
-D–devices –specialsデバイスファイルや特殊ファイルを保持する
-a–archive上記のオプションをすべて含んだ-rlptgoDと同じ
-v–verbose実行内容を表示する
-n–dry-run実際の処理は行わず、実行内容だけ表示する(テスト)
なし–deleteコピー元にないファイルを同期先から削除する
なし–delete-excludedコピー対象から除外したファイルも削除する
なし–exclude=パターン指定したパターンに該当したファイルは処理しない
なし–include=パターン指定したパターンに該当したファイルを処理する
なし–statsファイル数、転送サイズを表示する

rsyncコマンドで階層的にファイル・ディレクトリをコピーする方法

以下のオプションを用いることでrsyncコマンドでファイル・ディレクトリをコピーすることができます。

rsync -av --delete 【コピー元】 【コピー先】

コピー元のディレクトリ『/tmp/infra』、コピー先のディレクトリ『/data』を利用し、実際に実行してみると以下のようになります。
実施した概要を以下にメモします。

  1. ls -lRコマンドでコピー元のディレクトリ構成を確認する。
  2. ls -lRコマンドでコピー先のディレクトリ構成を確認する。
  3. rsyncコマンドのオプションに-nを追加し、実行することでテスト的に実行できるので想定通りか確認する。
  4. 実際にrsyncコマンドを実行し、ファイル・ディレクトリをコピーする。
  5. コピー先にファイル・ディレクトリにコピーされていることを確認する。
# ls -lR /tmp/infra/
/tmp/infra/:
合計 0
drwxr-xr-x 2 root root  6  9月  2 15:40 script
drwxr-xr-x 3 root root 37  9月  2 17:00 work

/tmp/infra/script:
合計 0

/tmp/infra/work:
合計 0
drwxr-xr-x 2 root root 23  9月  2 17:01 TEST01
-rw-r--r-- 1 root root  0  9月  2 15:40 test1.txt

/tmp/infra/work/TEST01:
合計 0
-rw-r--r-- 1 root root 0  9月  2 17:01 test2.txt

# ls -lR /data
/data:
合計 0

# rsync -avn --delete /tmp/infra /data
sending incremental file list
infra/
infra/script/
infra/work/
infra/work/test1.txt
infra/work/TEST01/
infra/work/TEST01/test2.txt

sent 233 bytes  received 38 bytes  542.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

# rsync -av --delete /tmp/infra /data
sending incremental file list
infra/
infra/script/
infra/work/
infra/work/test1.txt
infra/work/TEST01/
infra/work/TEST01/test2.txt

sent 309 bytes  received 74 bytes  766.00 bytes/sec
total size is 0  speedup is 0.00

# ls -lR /data
/data:
合計 0
drwxr-xr-x 4 root root 32  9月  2 17:03 infra

/data/infra:
合計 0
drwxr-xr-x 2 root root  6  9月  2 15:40 script
drwxr-xr-x 3 root root 37  9月  2 17:00 work

/data/infra/script:
合計 0

/data/infra/work:
合計 0
drwxr-xr-x 2 root root 23  9月  2 17:01 TEST01
-rw-r--r-- 1 root root  0  9月  2 15:40 test1.txt

/data/infra/work/TEST01:
合計 0
-rw-r--r-- 1 root root 0  9月  2 17:01 test2.txt

rsyncコマンドでディレクトリのみコピーする方法

以下のオプションを用いることでrsyncコマンドでディレクトリのみをコピーすることができます。

rsync -av --delete --include "*/" --exclude "*" 【コピー元】 【コピー先】


コピー元のディレクトリ『/tmp/app』、コピー先のディレクトリ『/data』を利用し、実際に実行してみると以下のようになります。
実施した概要を以下にメモします。

  1. ls -lRコマンドでコピー元のディレクトリ構成を確認する。
  2. ls -lRコマンドでコピー先のディレクトリ構成を確認する。
  3. rsyncコマンドのオプションに-nを追加し、実行することでテスト的に実行できるので想定通りか確認する。
  4. 実際にrsyncコマンドを実行し、ディレクトリのみをコピーする。
  5. コピー先にディレクトリのみがコピーされていることを確認する。
# ls -lR /tmp/app
/tmp/app:
合計 0
drwxr-xr-x 2 root root  6  9月  2 15:40 data
drwxr-xr-x 2 root root  6  9月  2 15:40 infra
drwxr-xr-x 3 root root 37  9月  2 15:43 nosync
drwxr-xr-x 2 root root  6  9月  2 15:40 script
drwxr-xr-x 3 root root 71  9月  2 15:41 work

/tmp/app/data:
合計 0

/tmp/app/infra:
合計 0

/tmp/app/nosync:
合計 0
drwxr-xr-x 2 root root 6  9月  2 15:43 TEST02
-rw-r--r-- 1 root root 0  9月  2 15:43 test5.txt

/tmp/app/nosync/TEST02:
合計 0

/tmp/app/script:
合計 0

/tmp/app/work:
合計 0
drwxr-xr-x 2 root root 23  9月  2 15:41 TEST01
-rw-r--r-- 1 root root  0  9月  2 15:40 test1.txt
-rw-r--r-- 1 root root  0  9月  2 15:40 test2.txt
-rw-r--r-- 1 root root  0  9月  2 15:40 test3.txt

/tmp/app/work/TEST01:
合計 0
-rw-r--r-- 1 root root 0  9月  2 15:41 test4.txt

# ls -lR /data
/data:
合計 0

# rsync -avn --delete --include "*/" --exclude "*" /tmp/app /data
sending incremental file list
app/
app/data/
app/infra/
app/nosync/
app/nosync/TEST02/
app/script/
app/work/
app/work/TEST01/

sent 282 bytes  received 48 bytes  660.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

# rsync -av --delete --include "*/" --exclude "*" /tmp/app /data
sending incremental file list
app/
app/data/
app/infra/
app/nosync/
app/nosync/TEST02/
app/script/
app/work/
app/work/TEST01/

sent 282 bytes  received 48 bytes  660.00 bytes/sec
total size is 0  speedup is 0.00

# ls -lR /data
/data:
合計 0
drwxr-xr-x 7 root root 71  9月  2 15:43 app

/data/app:
合計 0
drwxr-xr-x 2 root root  6  9月  2 15:40 data
drwxr-xr-x 2 root root  6  9月  2 15:40 infra
drwxr-xr-x 3 root root 20  9月  2 15:43 nosync
drwxr-xr-x 2 root root  6  9月  2 15:40 script
drwxr-xr-x 3 root root 20  9月  2 15:41 work

/data/app/data:
合計 0

/data/app/infra:
合計 0

/data/app/nosync:
合計 0
drwxr-xr-x 2 root root 6  9月  2 15:43 TEST02

/data/app/nosync/TEST02:
合計 0

/data/app/script:
合計 0

/data/app/work:
合計 0
drwxr-xr-x 2 root root 6  9月  2 15:41 TEST01

/data/app/work/TEST01:
合計 0

rsyncコマンドで特定のディレクトリ階層を除いてコピーする方法

やっていることはディレクトリのみをコピーする方法と同じです。

--exclude="ディレクトリパス(コピー元からの相対パス)"のオプションを利用することで特定のディレクトリ階層のファイルやディレクトリをコピーの対象から除くことができます。

rsync -av --delete --exclude "【ディレクトリパス(コピー元からの相対パス)】" 【コピー元】 【コピー先】

コピー元のディレクトリ『/tmp/develop』、コピー先のディレクトリ『/data』を利用し、除外対象のディレクトリとして『/tmp/develop/nosync』を指定し、実際に実行してみると以下のようになります。
実施した概要を以下にメモします。

  1. ls -lRコマンドでコピー元のディレクトリ構成を確認する。
  2. ls -lRコマンドでコピー先のディレクトリ構成を確認する。
  3. rsyncコマンドのオプションに-nを追加し、実行することでテスト的に実行できるので想定通りか確認する。
  4. 実際にrsyncコマンドを実行し、除外条件に該当するもの以外をコピーする。
  5. コピー先に除外条件に該当するもの以外がコピーされていることを確認する。
# ls -lR /tmp/develop
/tmp/develop:
合計 0
drwxr-xr-x 3 root root 37  9月  2 17:09 nosync
drwxr-xr-x 3 root root 37  9月  2 17:00 work

/tmp/develop/nosync:
合計 0
drwxr-xr-x 2 root root 6  9月  2 17:08 TEST02
-rw-r--r-- 1 root root 0  9月  2 17:08 test3.txt

/tmp/develop/nosync/TEST02:
合計 0

/tmp/develop/work:
合計 0
drwxr-xr-x 2 root root 23  9月  2 17:01 TEST01
-rw-r--r-- 1 root root  0  9月  2 15:40 test1.txt

/tmp/develop/work/TEST01:
合計 0
-rw-r--r-- 1 root root 0  9月  2 17:01 test2.txt

# ls -lR /data
/data:
合計 0

# rsync -avn --delete --exclude "nosync/" /tmp/develop /data
sending incremental file list
develop/
develop/work/
develop/work/test1.txt
develop/work/TEST01/
develop/work/TEST01/test2.txt

sent 202 bytes  received 34 bytes  472.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

# rsync -av --delete --exclude "nosync/" /tmp/develop /data
sending incremental file list
develop/
develop/work/
develop/work/test1.txt
develop/work/TEST01/
develop/work/TEST01/test2.txt

sent 278 bytes  received 70 bytes  696.00 bytes/sec
total size is 0  speedup is 0.00

# ls -lR /data
/data:
合計 0
drwxr-xr-x 3 root root 18  9月  2 17:08 develop

/data/develop:
合計 0
drwxr-xr-x 3 root root 37  9月  2 17:00 work

/data/develop/work:
合計 0
drwxr-xr-x 2 root root 23  9月  2 17:01 TEST01
-rw-r--r-- 1 root root  0  9月  2 15:40 test1.txt

/data/develop/work/TEST01:
合計 0
-rw-r--r-- 1 root root 0  9月  2 17:01 test2.txt
よかったらシェアしてね!
  • URLをコピーしました!
目次