通过bash脚本获取S3 Bucket子文件夹的大小

通过bash脚本获取S3 Bucket子文件夹的大小

我正在尝试编写一个 bash 脚本来获取 S3 存储桶中子文件夹的总大小。

我的桶道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

ETC...

这样我就可以获得文件夹的总大小

请帮忙!

答案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/

相关内容