一言で書くと:末尾が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/