s3に置いてあるファイルについて、複数ファイルをまとめたい時があります。
ファイルをダウンロードせずにファイル結合をできないものかとやってみました。
結論から言うと cp の標準入力と標準出力を駆使してみました。
aws s3 cp - s3://... : 標準入力から書き込める
aws s3 cp s3://... - : 標準出力から表示できる
こちらのclassmethod様の記事を大いに参考にさせていただいております。
https://dev.classmethod.jp/articles/aws-cli-s3-streaming/
以降にサンプルコードを書いたので参考にしてみてください。
サンプルファイル
分割されたファイルとしてこのようなファイルがあるとします。
aaa.text
aaa
aaa
aaa
bbb.txt
bbb
bbb
bbb
ccc.txt
ccc
ccc
ccc
上記のファイルが下記にあるとします。
aws s3 ls s3://hoge.bucket/concatenate_test/
2020-08-05 18:44:01 12 aaa.txt
2020-08-05 18:44:10 12 bbb.txt
2020-08-05 18:44:18 12 ccc.txt
ファイル結合
そんでこんなシェルスクリプトを実行してみます。
#!/bin/bash
(
aws s3 cp s3://hoge.bucket/concatenate_test/aaa.txt -;
aws s3 cp s3://hoge.bucket/concatenate_test/bbb.txt -;
aws s3 cp s3://hoge.bucket/concatenate_test/ccc.txt -;
) | aws s3 cp - s3://hoge.bucket/concatenate_test/abc.txt
中身を見てみると結合できてます。
aws s3 cp s3://hoge.bucket/concatenate_test/abc.txt -
aaa
aaa
aaa
bbb
bbb
bbb
ccc
ccc
ccc
ファイル結合して圧縮
それでは圧縮しながらコンカチもやってみます。
#!/bin/bash
(
aws s3 cp s3://hoge.bucket/concatenate_test/aaa.txt -;
aws s3 cp s3://hoge.bucket/concatenate_test/bbb.txt -;
aws s3 cp s3://hoge.bucket/concatenate_test/ccc.txt -;
) | gzip | aws s3 cp - s3://hoge.bucket/concatenate_test/abc.txt.gz
aws s3 cp s3://hoge.bucket/concatenate_test/abc.txt.gz - | zcat
aaa
aaa
aaa
bbb
bbb
bbb
ccc
ccc
ccc
圧縮ファイルをファイル結合
もともとのファイルがgz圧縮されていればそのままパイプしてしまえばいですね。
#!/bin/bash
(
aws s3 cp s3://hoge.bucket/concatenate_test/aaa.txt.gz - ;
aws s3 cp s3://hoge.bucket/concatenate_test/bbb.txt.gz - ;
aws s3 cp s3://hoge.bucket/concatenate_test/ccc.txt.gz - ;
) | aws s3 cp - s3://hoge.bucket/concatenate_test/abc.txt.gz