S3バケット内のサブフォルダの合計サイズを取得するためにbashスクリプトを作成しようとしています。
私のバケツ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
など...
これにより、フォルダのフルサイズを得ることができます
助けてください!
修正する 提案どおりにコードを編集しました。
#!/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
しかし、問題は、2019_06
ファイルがS3にあるため、bashスクリプトが存在するかどうかを確認できないことです。 $ 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