とりあえず結論
S3_BUCKET=sample-bucket
S3_PREFIX=sample_prefix/
FILES=(`aws s3 ls s3://${S3_BUCKET}/${S3_PREFIX} |awk '{print $4}' |sed -z 's/\n/ /g' |awk '{print substr($0, 1, length($0)-1)}'`)
echo ${FILES[@]}
#=> sample1.txt sample2.txt sample3.txt
前提
特定プレフィックス以下にフラットにファイルが存在している想定で行っている。
順に見ていく
1. S3 からファイル一覧を取得する
aws s3 ls s3://${S3_BUCKET}/${S3_PREFIX}
出力は次のようになる。
2022-01-01 01:01:01 0
2022-02-22 12:34:56 123 sample1.txt
2022-10-01 12:34:56 111 sample2.txt
2022-11-09 12:34:56 1 sample3.txt
2. ファイル名だけを取り出す
1では作成時間などの情報も載っているのでファイル名だけを抜き出す。
ファイル名は空白区切りで4番目なので awk
コマンドで $4
を指定すれば良い。
... |awk '{print $4}'
次のような出力になる。
sample1.txt
sample2.txt
sample3.txt
3. 一行にする
改行コードをスペースに置き換える。sed
コマンドの -z
オプションで NULL 文字分割を行い、置換する。
GNU sed を使う必要があるので MacOS の場合は Homebrew で gnu-sedをインストールするなどで対応する。
... |sed -z 's/\n/ /g'
次のような出力になる。
sample1.txt sample2.txt sample3.txt %
4. 最後のスペースを除去
3までだと最初と最後に1つスペースがついてしまう。
これを除去するために awk
コマンドで1文字目〜(文字列長-1)文字目までのsubstringを取得する。
... |aws '{print substr($0, 1, length($0)-1)}'
次のような出力になる。これで欲しい文字列が得られた。
sample1.txt sample2.txt sample3.txt
参考