一言で書くと:末尾がaかcで終わるディレクトリにマッチさせたいときに--include='*{a,c}/'だとダメで--include='*'{a,c}'/'とする必要があるという話。
多階層になっているフォルダから一部のファイルだけをrsyncしたいとする。rsyncの--include、--excludeが複雑怪奇なのはよく知られている[Link]が、試行錯誤が必要だったパターンがあったのでメモ。
次のようなフォルダ構成から、hoge_a/f1とhoge_c/f1の下のpngファイルだけをrsyncしたいとする。ディレクトリとしてはhoge_bもあるのがポイントで。
project
│ ...
│
└───hoge_a
│ │ ...
│ │
│ └───f1
│ | │ fuga.png
│ | │ ...
│ ...
│
└───hoge_b
│ │ ...
│ │
│ └───f1
│ | │ piyo.png
│ | │ ...
│ ...
└───hoge_c
│ │ ...
│ │
│ └───f1
│ | │ foo.png
│ | │ ...
│ ...
サフィクスがaとcのディレクトリだけ対象にしたいので、次のように*{a,c}でフィルタリングしようとしてもうまくいかない。
$ rsync -ahv --include='*{a,c}/f1/*.png' \
--include='*/' \
--exclude='*' \
remotehost:~/project/ ~/project/
次のように{a,c}をクオーテーションの外に書くと無事コピーが開始される。理由は知らない。
$ rsync -ahv --include='*'{a,c}'/f1/*.png' \
--include='*/' \
--exclude='*' \
remotehost:~/project/ ~/project/