困ったのでメモ
背景
- aws cliコマンドではS3から手元のローカルにコピーができる
- バケットの中にはめちゃくちゃファイルがあるが、その中からいくつかコピーしたい
- 「いくつか」とはいうものの、3000個ぐらいある…
- バケット内にあるファイルは、すべて同じ拡張子なので、includeオプション(例 --include '*.png') が使えない…
- 手元に全部同期(sync)して選別するにしても、1個1個のファイルサイズがそこそこあるので、全部ダウンロードしたら手元のディスクが死ぬ…
2つの解決策
aws s3 cp s3://my-bucket/mydir/foo/001.png .
aws s3 cp s3://my-bucket/mydir/foo/002.png .
aws s3 cp s3://my-bucket/mydir/foo/003.png .
...
- --includeオプションを複数連ねて大量に作って、1つのコマンドとして実行する
aws s3 cp s3://my-bucket/mydir/foo/ . --recursive \
--exclude '*' \
--include 001.png \
--include 002.png \
--include 003.png \
...
--includeで頑張るほうが良さそう
- awsコマンドを打つ度に認証なんやらが発生して、3000回awsコマンドを打つよりはincludeで頑張るほうが速い気がした(体感)
- ただ、バケット内のファイル一覧を最初にスキャンしているのか、ダウンロードが始まるまで多少時間がかかった
- --includeは100個くらいでないとだめそう。200個つけたら、ダウンロードが始まらなかった
- なので、結局awsコマンドは何回か叩くことにはなる
- ちなみにaws s3 cpはデフォルトが全部ダウンロード対象なので、--include は --exclude '*' とセットで使わないと意味がなかったので注意