下記のようなディレクトリ構造において、バケット直下や、「dir_A1/dir_B1」直下のディレクトリ一覧をJSONで取得する方法。
- s3://bucket_1/
- dir_A1/
- dir_B1/
- dir_C1/
- dir_C2/
- dir_C3/
- dir_B1/
- dir_A2/
- dir_A3/
- dir_A1/
バケット直下の場合
$ aws s3api list-object-v2 --bucket 'bucket_1' --prefix '' --delimiter '/' --output json { "CommonPrefixes": [ { "Prefix": "dir_A1/" }, { "Prefix": "dir_A2/" }, { "Prefix": "dir_A3/" } ] }
サブディレクトリ直下の場合
$ aws s3api list-object-v2 --bucket 'bucket_1' --prefix 'dir_A1/dir_B1/' --delimiter '/' --output json { "CommonPrefixes": [ { "Prefix": "dir_A1/dir_B1/dir_C1/" }, { "Prefix": "dir_A1/dir_B1/dir_C2/" }, { "Prefix": "dir_A1/dir_B1/dir_C3/" } ] }
「prefix」で調べたいディレクトリのパスを指定し(最後の「/」は含む)、「delimiter」に「/」を設定します。
すると、「prefix」で始まり、次の「delimiter」文字が出てくるまでのパス文字の一覧が、「CommonPrefixes」に格納されるので、それをもってディレクトリ一覧とします。
aws s3 ls
コマンドでも似たような一覧は取得できるのですが、aws s3
コマンドはJSON出力ができないので、aws s3api
コマンドを使用しました。
SDKを使う場合でも、「list-objects-v2」に該当するコマンドで同じパラメータを指定すれば、同じ結果を得ることができます。
その他
最初、aws s3 ls ~
でサクッとできるかと思ったのですが、意外に手間がかかるんですね。
本当はディレクトリというものはなく、バケットは、key(=パス)と中身(=ファイル)の「key-value」の集まりで、keyを「/」で区切ってディレクトリっぽく見せているだけのようです。
なので、厳密にはディレクトリ一覧ではなく、「CommonPrefixes」から分かるように、prefixの集まりになります。