我正在尝试编写一个 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/