この記事は Z Lab Advent Calendar 2021 の8日目の記事となります。
TL;DR
以下は .rpm
という拡張を持つオブジェクトのみを rsync する例なのでユースケースに応じて書き換えてください。
$ gsutil rsync -x '^(?!.*\.rpm$).*$' src_url dst_url
解説
gsutil ls
や gsutil cp
では *
や ?
などのワイルドカードが使えますが、gsutil rsync
では以下のように src_url として単一の URL しか指定することができません。
$ gsutil rsync -r "gs://my-bucket/*.rpm" my-data
CommandException: Destination (gs://my-bucket/*.rpm) must match exactly 1 URL
これを解消するために -x
オプションを使用して、不要なオブジェクトを除外するというアプローチを多くの方が紹介していますが、不要なオブジェクトが増える度にその命名に合わせてオプションを追加するのは面倒です。
なので、先述のコマンドのように .rpm
という拡張子を持つオブジェクトのみを rsync したいケースでは、以下のように -x
オプションで .rpm
という拡張子を持っていないオブジェクトを除外する という使い方をした方がメンテナンスもしやすいかなと考えました。
$ gsutil rsync -r -x '^(?!.*\.rpm$).*$' gs://my-bucket my-data
-x
オプションでは Python の正規表現がサポートされている仕様で、上記の正規表現については以下のブログを参考にさせてもらいました。
- https://uxmilk.jp/50674
- https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c#%E8%BF%BD%E8%A8%98%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E5%90%A6%E5%AE%9A%E7%9A%84%E5%85%88%E8%AA%AD%E3%81%BF