2021/07/23
shell script(bash)を使って、GCSのファイルを再帰的に処理する
やったこと
とあるGCS bucketに格納されている全ての(画像)ファイルを別のGCS bucketへコピーして、その後公開する必要があり
bash scriptを作って対応しました。(備忘録がてらscriptを残しておきます。)
前提事項
gsutil
というgoogle cloud storageを操作するclientライブラリは事前にインストールしておく必要があります。- またコピー先のGCS bucketのACLはオブジェクト毎にACLを「きめ細かく管理」できるようにしておきます。
作ったscript
function copy_files() {
from=${1}
from_bucket_name=${2}
to_bucket_name=${3}
echo "gsutil ls ${from}"
from_objects=($(gsutil ls ${from}))
for from_object in "${from_objects[@]}" ; do
if [[ ${from_object} == */ ]] ; then
# directoryの場合、再帰呼出
copy_files ${from_object} ${from_bucket_name} ${to_bucket_name}
else
file_path=${from_object#gs://${from_bucket_name}}
to_object="gs://${to_bucket_name}${file_path}"
echo "gsutil cp ${from_object} ${to_object}"
# コピーします。
gsutil cp ${from_object} ${to_object}
# public readのaclを設定します。
gsutil acl ch -u AllUsers:R ${to_object}
fi
done
}
from_bucket_name=your-original-bucket-name # please set bucket name here
to_bucket_name=your-copy-to-bucket-name # please set bucket name here
copy_files "gs://${from_bucket_name}" ${from_bucket_name} ${to_bucket_name}
以上のscriptを実行して、実現しました。
単一のbucket内のファイルに対する操作
いくつか試行錯誤の最中に、特定のbucket内の全てのファイルを公開するscriptも作りましたので、こちらも割と便利です。
function publish_files() {
key=${1}
echo "gsutil ls ${key}"
keys=($(gsutil ls ${key}))
for key in "${keys[@]}" ; do
echo ${key}
if [[ ${key} == */ ]] ; then
# directoryの場合、再帰呼出
publish_files $key
else
# public readのaclを設定します。(もしobject毎に別の操作が必要であれば、ここを編集する)
echo "gsutil acl ch -u AllUsers:R ${key}"
gsutil acl ch -u AllUsers:R ${key}
fi
done
}
bucket_name=your-target-bucket-name # please set bucket name here
publish_files "gs://${bucket_name}"
以上です。
関連する記事

[Rust]Google Cloud Storageを利用する
GCSやNFSのファイルを扱えるpackageをRustで実装しました。

CloudflareとGCSを組合せて安く静的ファイル配信サーバー(HTTPS)を構築する
CloudflareとGoogle Gloud Storageを組合せて安くHTTPS対応の画像配信の仕組みを構築しました

shell script(bash)を使って、GCSのファイルを再帰的に処理する
Google Cloud Storageの特定のbucketのファイルを全てコピーして、公開する必要があったので、bashスクリプトを作って対応しました

[Python3]Google Cloud Storage Clientの便利なラッパーを作りました
djangoのstorages.backends.gcloudを参考にしつつ、google-cloud-storageのラッパーを作りました