カテゴリー
【シェルコマンド基礎講座】rsyncコマンドの使い方を細かく検証しながらinclude/excludeのコツを覚える
※ 当ページには【広告/PR】を含む場合があります。
2023/09/19
目次
- 1. rsyncコマンドを使いこなすメリットとは?
- 2. rsyncコマンドを具体例から小出しに考えてみる
- 2-1. rsyncコマンドの基本的な使い方
- 2-2. include/excludeオプションで同期対象をフィルタリングする
- 2-3. rsyncのフィルタの基本は除外(exclude)していく
- 2-4. ファイル名に「*」を付ける・付けないの違い
- 2-5. rsyncで使えるフィルタの簡易正規表現 〜 『*』・『**』・『?』
- 2-6. 注意が必要なrsyncのフィルタで「/(スラッシュ)」のルール
- 2-7. 特定のフォルダを除外する
- 2-8. 特定の階層の特定のファイルだけ除外する
- 2-9. 同一ファイル名の指定があった場合には先に指定されたほうが優先
- 2-10. ルート階層のファイルだけ含める・除外する
- 2-11. 複数のファイルパターンでマッチさせる
- 3. まとめ
+ rsync独自の簡易正規表現を良く理解しよう
+ 基本的にはexcludeでフィルタリングしていこう
+ フィルタを付ける順序には気をつけよう
rsyncコマンドを使いこなすメリットとは?
1. SSH経由でネットワーク上にある別のローカルマシーン上のリソースを同期
2. AWS EC2などのクラウド上のLinuxインスタンスにあるリソースを同期
3. Docker等でホストOSとコンテナ間のリソースを同期
find
grep
read
SRC_DIR=./src
DST_DIR=./dst
find ${SRC_DIR} -maxdepth 1 | grep -E "<...特定のファイル名でフィルタ>" | while read -r fname; do
cp "$fname" "${DST_DIR}/"
done
rsyncコマンドを具体例から小出しに考えてみる
$ sudo apt install rsync
$ rsync --version
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
#...
rsyncコマンドの基本的な使い方
src
dst
src
$ rsync -av src/ dst/
#もしくは
$ rsync -avP src/ dst/
-av/-avP
rm -rf
「rsync --help」
src
fuga
moga
$ tree -a src
src
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
src
dst
$ rsync -av src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
include/excludeオプションで同期対象をフィルタリングする
include/exculde
すべてのフォルダ・ファイルを含む
$ rsync -av src/ dst/
#👇明示な書き換え
$ rsync -av --include="*" src/ dst/
「*」(アスタリスク文字)
すべてのファイル名にマッチ
--include="*"
$ rsync -av --include="fuga/" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
fuga
src
$ rsync -av --include="fuga/" src/ dst/
#👇明示に書き換え
$ rsync -av --include="*" --include="fuga/" src/ dst/
「"*"」
fuga
rsyncのフィルタの基本は除外(exclude)していく
exclude
$ rsync -av --exclude="piyo.txt" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ └── fugafuga.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
└── moga
├── a.moga.txt
├── b-moga.txt
├── c_moga.txt
├── moga.log
├── moga.txt
└── mogamoga.txt
piyo.txt
fuga
moge
piyo.txt
$ rsync -av --exclude="piyo.txt" src/ dst/
#👇これでも同じ結果になる
$ rsync -av --exclude="*piyo.txt" src/ dst/
「*piyo.txt」
ルート
fuga
moga
piyo.txt
「*」
ファイル名に「*」を付ける・付けないの違い
「*」
$ rsync -av --exclude="hoge.txt" src/ dst/
$tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
src
hoge.txt
「*hoge.txt」
$ rsync -av --exclude="*hoge.txt" src/ dst/
$ tree -a dst
dst
├── .hoge
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
hoge.txt
hoge.txt
a.hoge.txt
b-hoge.txt
c_hoge.txt
hogehoge.txt
「*」
『*』-->『[^/]+』
『*hoge.txt』-->『[^/]+hoge\.txt$』
rsyncで使えるフィルタの簡易正規表現 〜 『*』・『**』・『?』
『*』
『**』
『**』-->『.+』
『*』
**hoge.txt
『**』
fuga/a/hoge.txt
fuga/b/c.hoge.txt
fuga/d/e/f.hoge.txt
fuga/d/g/h.i.hoge.txt
...
『?』
『?』-->『[^/]』
x.hoge.txt
x-hoge.txt
x_hoge.txt
xxhoge.txt
...
注意が必要なrsyncのフィルタで「/(スラッシュ)」のルール
『^』
hoge.txt(ルートフォルダ内のみ)
『/hoge.txt』-->『^hoge\.txt$』
hoge.txt
fuga/hoge.txt
moga(フォルダ)
a/moga(フォルダ)
a/b/moga(フォルダ)
...
「moga」と言うフォルダ
「moga」と言うファイル
特定のフォルダを除外する
$ rsync -av --exclude="fuga/" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
<フォルダ名>/
「/」(スラッシュ)
特定の階層の特定のファイルだけ除外する
$ rsync -av --exclude="fuga/piyo.txt" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ └── fugafuga.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
$ rsync -av --include="fuga/piyo.txt" --exclude="fuga/*" src/ dst/
#👇でも同じ
#rsync -av --include="piyo.txt" --exclude="fuga/*" src/ dst/
#rsync -av --include="*piyo.txt" --exclude="fuga/*" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
「*」
--exclude="fuga/"
$ rsync -av --include="piyo.txt" --exclude="fuga/" src/ dst/
$ tree -a dst
dst
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
同一ファイル名の指定があった場合には先に指定されたほうが優先
exclude
include
$ rsync -av --exclude="piyo.txt" --include="piyo.txt" src/ dst/
$ tree -a dst/
dst/
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ └── fugafuga.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
└── moga
├── a.moga.txt
├── b-moga.txt
├── c_moga.txt
├── moga.log
├── moga.txt
└── mogamoga.txt
piyo.txt
$ rsync -av --include="piyo.txt" --exclude="piyo.txt" src/ dst/
$ tree -a dst/
dst/
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ ├── mogamoga.txt
│ └── piyo.txt
└── piyo.txt
ルート階層のファイルだけ含める・除外する
「<ファイル名>」(「/」文字を含まない)
piyo.txt
piyo.txt
$ rsync -av --exclude="*/piyo.txt" src/ dst/
$ tree -a dst/
dst/
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ └── fugafuga.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
├── moga
│ ├── a.moga.txt
│ ├── b-moga.txt
│ ├── c_moga.txt
│ ├── moga.log
│ ├── moga.txt
│ └── mogamoga.txt
└── piyo.txt
/fuga/piyo.txt
/moga/piyo.txt
/piyo.txt
piyo.txt
$ rsync -av --exclude="/piyo.txt" src/ dst/
$ tree -a dst/
dst/
├── .hoge
├── a.hoge.txt
├── b-hoge.txt
├── c_hoge.txt
├── fuga
│ ├── a.fuga.txt
│ ├── b-fuga.txt
│ ├── c_fuga.txt
│ ├── fuga.log
│ ├── fuga.txt
│ ├── fugafuga.txt
│ └── piyo.txt
├── hoge.log
├── hoge.txt
├── hogehoge.txt
└── moga
├── a.moga.txt
├── b-moga.txt
├── c_moga.txt
├── moga.log
├── moga.txt
├── mogamoga.txt
└── piyo.txt
/piyo.txt
複数のファイルパターンでマッチさせる
$ rsync -av \
--exclude=".*" \
--exclude="hoge*.txt" \
--exclude="*fuga.*" \
--exclude="??g?.log" \
--exclude="a.*" \
--exclude="b-*.*" \
--exclude="/piyo.txt" \
--exclude="/**moga.txt" \
src/ dst/
$ tree -a dst/
dst/
├── c_hoge.txt
├── fuga
│ └── piyo.txt
└── moga
└── piyo.txt
まとめ
+ rsync独自の簡易正規表現を良く理解しよう
+ 基本的にはexcludeでフィルタリングしていこう
+ フィルタを付ける順序には気をつけよう
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー
- 1. rsyncコマンドを使いこなすメリットとは?
- 2. rsyncコマンドを具体例から小出しに考えてみる
- 2-1. rsyncコマンドの基本的な使い方
- 2-2. include/excludeオプションで同期対象をフィルタリングする
- 2-3. rsyncのフィルタの基本は除外(exclude)していく
- 2-4. ファイル名に「*」を付ける・付けないの違い
- 2-5. rsyncで使えるフィルタの簡易正規表現 〜 『*』・『**』・『?』
- 2-6. 注意が必要なrsyncのフィルタで「/(スラッシュ)」のルール
- 2-7. 特定のフォルダを除外する
- 2-8. 特定の階層の特定のファイルだけ除外する
- 2-9. 同一ファイル名の指定があった場合には先に指定されたほうが優先
- 2-10. ルート階層のファイルだけ含める・除外する
- 2-11. 複数のファイルパターンでマッチさせる
- 3. まとめ