bbb

Amazon S3はオブジェクトストレージサービスであり、厳密には「ディレクトリ」という概念は存在しません。しかし、プレフィックス(疑似ディレクトリ)を使ってオブジェクトを整理することができます。AWS CLIを使用してプレフィックス(疑似ディレクトリ)内の全オブジェクトの作成時間を取得することで、プレフィックスの作成時間を間接的に確認できます。

以下はAWS CLIを使用して、特定のプレフィックス内のオブジェクトの最初の作成日(プレフィックスの作成時間の参考)を取得する方法の例です。

  1. aws s3api list-objects コマンドを使用してプレフィックス内のオブジェクトをリストします。
  2. jqコマンドなどを使用して、タイムスタンプを取り出します。

以下は具体的なコマンド例です:

aws s3api list-objects --bucket your-bucket-name --prefix your-prefix/ --query 'Contents[].[Key,LastModified]' --output json | jq '.[] | {Key: .[0], LastModified: .[1]}'

このコマンドは以下の動作を行います:

  • aws s3api list-objects コマンドで指定したバケットとプレフィックス内のオブジェクトをリストします。
  • --query 'Contents[].[Key,LastModified]' 部分で、オブジェクトキーと最終更新日時のペアを取得します。
  • --output json で出力をJSON形式に設定し、jqコマンドでJSONを処理します。
  • jqコマンドでオブジェクトキーと最終更新日時をフィルタリングして表示します。

なお、プレフィックス内の最初(おそらく最古)のオブジェクトがプレフィックスの「作成時間」に最も近い時間となります。

注意:プレフィックス内に大量のオブジェクトがある場合、リストの取得が遅くなることがあります。その場合は、--max-items オプションなどを利用して逐次処理することも検討してください。

AWS CLIの出力時間はデフォルトでUTC(協定世界時)で表示されます。JST(日本標準時)に変換するには、出力結果を加工する必要があります。jqを使用してタイムスタンプを加工する方法の一例です。

まず、AWS CLIを使用してオブジェクトのリストを取得し、jqを使ってタイムスタンプをJSTに変換します。以下のようにすることができます:

  1. AWS CLIでプレフィックス内のオブジェクト一覧を取得し、JSON形式で出力します。
  2. jqを使用してタイムスタンプをJSTに変換します。
aws s3api list-objects --bucket your-bucket-name --prefix your-prefix/ --query 'Contents[].[Key,LastModified]' --output json | jq -r '.[] | (.LastModified + "Z") as $date | $date | {Key: .[0], LastModified: ($date | strptime("%Y-%m-%dT%H:%M:%S.%NZ") | mktime | . + 32400 | todate)}'

このコマンドのポイントは以下の通りです:

  • aws s3api list-objects コマンドで、指定したバケットとプレフィックス内のオブジェクトをリストします。
  • --query 'Contents[].[Key,LastModified]' でオブジェクトキーと最終更新日時を取得します。
  • jq -r でjqの出力を加工しています。
  • .[] で各オブジェクトに対して処理を行います。
  • (.LastModified + "Z") as $date は、UTCのタイムスタンプをZで終わる形式に修正しています。
  • strptime("%Y-%m-%dT%H:%M:%S.%NZ") は文字列をパースして、時間データに変換します。
  • mktime でUnix時間(エポック秒)に変換します。
  • .+ 32400 で32400秒(9時間)加算してJSTに変換します。
  • todate で再び日付文字列に変換します。

このコマンドによって、日本標準時間(JST)に変換されたプレフィックス内のオブジェクトの最終更新日時を確認することができます。

おっしゃる通り、以前のコマンドには誤りがありました。正しくJSTに変換するためのjqの処理を修正します。

下記のように再修正しました。.LastModified を正しく扱い、UTC時間をJST時間に変換する方法は以下の通りです:

aws s3api list-objects --bucket your-bucket-name --prefix your-prefix/ --query 'Contents[].[Key,LastModified]' --output json | jq -r '.[] | {Key: .[0], LastModified: (.LastModified | fromdateiso8601 | . + 32400 | todateiso8601)}'

このコマンドのポイントは次の通りです:

  • aws s3api list-objects コマンドで、指定したバケットとプレフィックス内のオブジェクトをリストします。
  • --query 'Contents[].[Key,LastModified]' でオブジェクトキーと最終更新日時を取得します。
  • jq -r '.[] | {Key: .[0], LastModified: (.LastModified | fromdateiso8601 | . + 32400 | todateiso8601)}' で、以下の処理を行います。
  • fromdateiso8601 でISO 8601形式の日付をUnixタイムスタンプに変換します。
  • . + 32400 でUnixタイムスタンプに32400秒(9時間)を加算します。
  • todateiso8601 で再びISO 8601形式の日付に変換します。

これにより、出力結果がJST時間で表示されるようになります。

コメント

タイトルとURLをコピーしました