わかりやすい

主にIT関連や時事ネタの興味を持ったことを、なるべくわかりやすく書いてみようとおもいます。

スポンサーリンク

rsyncのinclude, excludeについて

超お久しぶりです。

みなさん、rsync使ってますか? バックアップとかリリースとか、工夫次第でいろいろ使えて便利ですよね。 けど、特定のファイルとかディレクトリを対象(対象外)にしたい場合に使うincludeとexcludeの使い方、難しくないですか? 自分向けのメモの意味も含めて、少し整理してみたいと思います。

#現時点では動作検証まではしていませんので、間違いが含まれるかもしれません。悪しからず…。

基本

rsyncは以下のような動作をする。

  1. コピー候補となるファイルリストを作成する
  2. 上記で作ったファイルリストの1行ずつに対して、コピーするかしないか判定する

上記の2.の動作が一番の本題ですね。

  1. 引数で与えられたinclude, excludeについて、指定順に評価する
  2. 条件に合致した時点で動作が確定する(合致した条件以降の条件は評価されない)

上記に加えて、以下の動きをします。

  • あるディレクトリがコピー対象外と判定された場合、そのディレクトリ配下の全ファイル・全ディレクトリはコピー対象外になる

さて、これだけだとちょっとわかりにくいので具体例を。

具体例

前提

例えば以下のようなディレクトリツリーがあったとします。

./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が評価され、マッチした時点で動作が確定する
    • ディレクトリがコピー対象外として判定された場合、その配下のファイル、ディレクトリは無条件にコピー対象外となる

ではまた。

参考文献

tech.nitoyon.com