出力ファイルの各行を同じbashスクリプトのforループにパラメータとして渡す方法は?

出力ファイルの各行を同じbashスクリプトのforループにパラメータとして渡す方法は?

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

関連情報