rsyncのinclude, excludeについて
超お久しぶりです。
みなさん、rsync使ってますか? バックアップとかリリースとか、工夫次第でいろいろ使えて便利ですよね。 けど、特定のファイルとかディレクトリを対象(対象外)にしたい場合に使うincludeとexcludeの使い方、難しくないですか? 自分向けのメモの意味も含めて、少し整理してみたいと思います。
#現時点では動作検証まではしていませんので、間違いが含まれるかもしれません。悪しからず…。
基本
rsyncは以下のような動作をする。
- コピー候補となるファイルリストを作成する
- 上記で作ったファイルリストの1行ずつに対して、コピーするかしないか判定する
上記の2.の動作が一番の本題ですね。
- 引数で与えられたinclude, excludeについて、指定順に評価する
- 条件に合致した時点で動作が確定する(合致した条件以降の条件は評価されない)
上記に加えて、以下の動きをします。
- あるディレクトリがコピー対象外と判定された場合、そのディレクトリ配下の全ファイル・全ディレクトリはコピー対象外になる
さて、これだけだとちょっとわかりにくいので具体例を。
具体例
前提
例えば以下のようなディレクトリツリーがあったとします。
./hoge.txt ./fuga/moge.txt
これを/var/tmp配下にコピーしたい場合で考えたいと思います。
rsyncの動作(include, exclude指定なし)
素直に全部コピーしたい場合は
rsync -avP ./ /var/tmp
こんなコマンドになります。
ファイルリストの作成
rsyncは以下のようなファイルリストを得ます。
./ ./hoge.txt ./fuga/ ./fuga/moge.txt
ファイルは2つですが、ディレクトリもリストに含まれることになる点がポイント。
コピーされるもの
includeもexcludeも無いので、全ディレクトリ・全ファイルがコピー対象になります。
rsyncの動作(include, exclude指定あり)
さて、例えば
rsync -avP --include="moge.txt" --exclude="fuga/" ./ /var/tmp
こんなオプションで実行したとします。
ファイルリストの作成
再掲。
./ ./hoge.txt ./fuga/ ./fuga/moge.txt
コピーされるもの
前述の通り、ファイルリストの1行ずつに対して評価されます。
./
includeにもexcludeにも合致しないので、コピーされます。
./hoge.txt
includeにもexcludeにも合致しないので、コピーされます。
./fuga/
includeには合致しませんが、excludeに合致しますね。コピーされません。
./fuga/moge.txt
includeに合致しますが、上位ディレクトリ(./fuga/)がコピー対象外になっているのでコピーされません。
まとめ
以下を抑えておくと、うまく使いこなせるのではないでしょうか。
- rsyncは以下のような動作をする
- ファイルリストを作る
- ファイルリストの1行(各ディレクトリ、ファイル)に対して、引数に指定された順番でincludeやexcludeが評価され、マッチした時点で動作が確定する
- ディレクトリがコピー対象外として判定された場合、その配下のファイル、ディレクトリは無条件にコピー対象外となる
ではまた。