我正在尝试编写一个 bash 脚本来获取 S3 存储桶中子文件夹的总大小。
我的桶道s3://path1/path2/subfolders
在 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...
这样我就可以获得文件夹的总大小
请帮忙!
更新 我已经按照建议编辑了代码
#!/bin/bash
FILES=$(mktemp)
aws s3 ls "s3://path1/path2/" >> "$FILES"
for file in `cat $FILES`
do
if [ -n "$file" ]
echo $file
done
答案1
aws s3 ls "s3://path1/path2/" | while read file
do
# do something with $file
done
答案2
首先,如果你想检查文件是否存在,不需要感叹号,!
因为[ -e FILE ]
会返回True if FILE exists
。
但问题是您的 bash 脚本无法检查是否2019_06
存在,因为这些文件位于 S3 中。 $FILES 中的行只是字符串。
你可以用[ -n STRING ]
whichmeans来检查True if the length of "STRING" is non-zero
。
for file in `cat $FILES`
do
if [ -n "$file" ]
then
echo $file
s3cmd du -r s3://path1/path2/$file
fi
done
答案3
在某些极端情况下,使用通配符可能会出现问题。下面使用的是find
不太容易出现这些问题的方法。
find "s3://path1/path2/" -type f | while read -r file
do
echo $file
done