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/

관련 정보