あるディレクトリ以下の特定パターンのファイルのみrsyncしたい。
例えば以下のディレクトリでgz拡張子のファイルだけrsyncしたい。gz拡張子を含まないsub3ディレクトリ以下はrsyncしたくないとする。
$ tree src
src/
├── a.gz
├── sub1/
│ ├── b.gz
│ └── sub2/
│ └── c.gz
└── sub3/
└── other.log
これをこうコピーしたい。
dst/
├── a.gz
└── sub1/
├── b.gz
└── sub2/
└── c.gz
これを実現するにあたって結構な時間はまったのでメモする。
-
--include
,--exclude
は定義した順に評価される。マッチしたらそこで評価終わり。 -
--include="*.gz"
をサブディレクトリにも適用するには--include="*/" --include="*.gz" --exclude="*"
と書く。--include="*/"
がポイント。 -
--include="*/"
としたのでsub3が空ディレクトリで宛先にコピーされてしまう。これを回避するためには-m
(prune empty directory chains from file-list) を付ける。これでsub3はディレクトリごとコピーされなくなる。
というわけで最終的には以下で。
$ rsync -arm --include="*/" --include="*.gz" --exclude="*" src/ dst/