S3の容量をディレクトリ毎に調べる方法

S3の容量がディレクトリ毎でどれくらい使っているかを知りたいと思いやり方を調べてみたのですが、 コマンド一発で簡単にできるみたいな方法はみつかりませんでした。

大量のディレクトリがあったので手動でコマンド叩くのもめんどうすぎたのでシェルをつくってみました。

LIST=`aws s3 ls s3://[対象ディレクトリのパス]/ | grep PRE | awk '{print $2}' | sed -e ':loop; N; $!b loop; s/\n/ /g'`
for DIR in $LIST
do
  SIZE=`aws s3 ls s3://[対象ディレクトリのパス]/${DIR} --recursive --sum | tail -n 1 | awk '{print $3}'`
  echo $DIR,$SIZE
done

最終的にできたスクリプトがこちらになります。
対象ディレクトリのパスを置き換えれば以下のディレクトリの容量がCSV形式で出力されます。

ざっくりコマンドの内容も説明しておきます。

S3の容量取得

aws s3 ls s3://[対象ディレクトリのパス]/${DIR} --recursive --sum | tail -n 1 | awk '{print $3}'

S3の容量は「aws s3 ls」コマンドに「–recursive」「–sum」オプションをつけて調べます。
総容量だけが欲しかったので「tail -n 1」で最後の行だけ抜き出しています。
最後に「awk」コマンドで文字列を分割し3番目の容量のみを出力しています。

対象ディレクトリ以下のディレクトリを抽出

LIST=`aws s3 ls s3://[対象ディレクトリのパス]/ | grep PRE | awk '{print $2}' | sed -e ':loop; N; $!b loop; s/\n/ /g'`

「aws s3 ls」コマンドで対象ディレクトリ以下のオブジェクト一覧を出力し、
「grep」コマンドでPREが入っているディレクトリ行のみに絞ります。
「awk」コマンドでディレクトリ名のみを抽出し、「sed」コマンドで改行を除去しています。

シェルでの改行除去は「:loop;N;$!b loop;」で全行ループするような処理をしてあげます。

setコマンドでの文字列分割

ここではawkで文字列の分割をし容量を抽出しましたが、 「set」コマンドでも同様のことができます。

  ROW=`aws s3 ls s3://das-pro-games-data/necro/${DIR} --recursive --sum | tail -n 1`
  set -- $ROW
  echo $DIR,$3

IFS変数にはデフォルトでスペースをがセットされているので必要はありませんが、
明示的にするのであればスクリプトの開始、終了時に差し込むとよいかと思います。

OLDIFS=$IFS
IFS=" "
~~~~~~~~~~~~~
実処理
~~~~~~~~~~~~~
IFS=$OLDIFS