Bashスクリプトを介してS3 Bucketサブフォルダのサイズを取得する

Bashスクリプトを介してS3 Bucketサブフォルダのサイズを取得する

S3バケット内のサブフォルダの合計サイズを取得するためにbashスクリプトを作成しようとしています。

私のバケツs3://パス1/パス2/サブフォルダ

path2フォルダ内には、次のような多くのサブフォルダがあります。

2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12

Bashスクリプトから各サブフォルダのサイズを取得する必要があります。

私はこのようなスクリプトを書いた。

**

#!/bin/bash

    FILES=$(mktemp)

    aws s3 ls "s3://path1/path2/"  >> "$FILES"

   cat $FILES
echo
for file in $FILES
do    
  if [ ! -e "$file" ]      
  then 
s3cmd du -r  s3://path1/path2/$file
   echo "$file"; echo
   continue               
 fi 

echo
done

**

cat $tmpfileの出力は次のとおりです。

2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12

しかし、エラーが発生します。 forループに変数を渡すとき。理想的には、私の目標は、forループが各反復ごとにdo内で実行されることです。コマンドは次のようにする必要があります。

s3cmd du -r s3://path1/path2/2019_06

s3cmd du -r s3://path1/path2/2019_07

s3cmd du -r s3://path1/path2/2019_08

など...

これにより、フォルダのフルサイズを得ることができます

助けてください!

答え1

あまりにも多くの要求をするのではなく、バケット内のすべてのオブジェクトを繰り返し一覧表示し、出力からローカルにすべてのサイズを追加します。

スタート:aws s3 ls --recursive s3://path1/ > all-files.log

その後、all-files.logローカルで処理します。はるかに簡単:)

答え2

最初のステップの元のスクリプトでは、一時$FILESファイル名を使用してS3ファイル名を保存しました。しかし、最後のステップでは、ファイルのリストが配列にあることを望みます$FILES

lsこのエラーは修正できますが、一時ファイルを使用せずに結果のみを処理するようにスクリプトを再構築することをお勧めします。これにより、作業がはるかに簡単になります。

以下は作業スクリプトです。関数として追加することもできます~/.bashrc

function s3du {
    readonly folder_to_scan=${1:?"The argument 's3://bucket/folder_to_scan/' must be specified."}

     for subfolder in $(aws s3 ls "${folder_to_scan}" | grep PRE | awk '{print $2}'); do 
        echo "${folder_to_scan}${subfolder}:" 
        aws s3 ls "${folder_to_scan}${subfolder}" --recursive \
            --human-readable \
            --summarize \ 
            | tail -n2 
    done
}

このようにしてくださいs3du s3://my-bucket/my-folder/

関連情報