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/