はじめに
S3にはフォルダという概念はなくて、folder/foobar.png
というファイル名だったと思ったが、Management Consoleを確認してみたら
となっていたので、フォルダという表記で進める。
やりたいこと
Bucket内のfooフォルダの中に1万ほどファイルがあって、これをbarフォルダにコピーしたい。
Management ConsoleにCopy
とPaste Into
というメニューがあったので、これを使ったらできるかなと思ったけど無理でした。さて、バッチでも書くか。と思ったらどうやらaws-cliを入れるとTerminalから
$aws s3 sync s3://bucket-src s3://bucket-target --exclude *.tmp
みたいな感じで操作ができるみたい。
aws-cliのインストール
pipでインストールできる。
$ pip install awscli
接続情報の設定
configure
コマンドでインタラクティブに設定する。
$ aws configure
Traceback (most recent call last):
#-*- snip -*-
ValueError: unknown locale: UTF-8
と思ったらエラー。どうやら、locale
の設定ができていないよう。
$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
言語の設定を入れてあげる。設定できるlocaleはlocale -a
で確認できる。今回は、ja_JP.UTF-8
を設定することにした。そして、Terminalを閉じる度に設定するのも面倒なので.bash_profile
に設定を反映させた。
$ echo 'export LC_ALL=a_JP.UTF-8' >> ~/.bash_profile
$ echo 'export LANG=a_JP.UTF-8' >> ~/.bash_profile
$ source ~/.bash_profile
再度configure
コマンドを実行してみる。
$ aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]:
Asia Pacific (Tokyo) Regionはap-northeast-1
。それ以外は、Regions and Endpoints - Amazon Web Servicesで確認する。
Auto Completionの設定
Tabでコマンドの補完を行えるように設定する。zshやtcshの人は公式ドキュメントに従って設定する。bashの人はcomplete
コマンドを利用する。
$ echo 'complete -C aws_completer aws' >> ~/.bash_profile
$ source ~/.bash_profile
aws-cliの利用
bucketの中身の確認
$ aws s3 ls s3://mybucket
PRE foo/
PRE bar/
2014-05-27 11:52:47 3298 foobar.png
フォルダのコピー
$ aws s3 sync s3://mybucket/foo s3://mybucket/bar
copy: s3://mybucket/foo/47484652.jpg to s3://mybucket/bar/47484652.jpg
copy: s3://mybucket/foo/47484653.jpg to s3://mybucket/bar/47484653.jpg
copy: s3://mybucket/foo/47484654.jpg to s3://mybucket/bar/47484654.jpg
...
コピー時の注意
- 一ファイルずつコピーのログが表示されるので、大量のファイルをコピーする際は
--quiet
オプションをつけたほうがいい。 - 同一ファイル名があった場合、ファイルサイズが違う場合は上書き、そうでない場合はスキップされる。
- ただし、同一ファイル名でファイルサイズも同じ場合でも、コピー元のファイル作成日が新しい場合は上書きされる。
参考サイト
AWS S3 copy files and folders between two buckets
Pelican 3.3 pelican-quickstart error “ValueError: unknown locale: UTF-8”