1
1

More than 1 year has passed since last update.

S3の特定プレフィックス以下のファイル名をBashの配列に格納するワンライナー

Posted at

とりあえず結論

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

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1