2021/07/23

shell script(bash)を使って、GCSのファイルを再帰的に処理する

gcpshell

やったこと

とある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}"

以上です。