3

PowerShell を使用して、S3 バケットから「フォルダー」のリストのみを取得する簡単な方法はありますか? 私が作業しているバケットには何十万もの個別のオブジェクトがあり、それには非常に長い時間がかかります。

これは本当にばかげた質問である可能性があり、その場合は申し訳ありませんが、GoogleまたはSOでこれに答えるものを見つけることができませんでした. Get-S3Object の -KeyPrefix および -Key パラメータにワイルドカードを追加しようとしましたが、役に立ちませんでした。それは、私が求めていることを実行できると思われる唯一のコマンドレットです。

無意味な裏話: ファイルを正しい既存のフォルダに転送していることを確認したいだけです。私は契約したサードパーティであるため、コンソールへのログイン アクセス権がなく、AWS アカウントを維持する人でもありません。

Java や C# などを使用してこれが可能であることはわかっていますが、PS でこのかなり単純なプロジェクトに関連する他のすべてのことを行っており、それに固執できることを望んでいました。

前もって感謝します。

4

4 に答える 4

3

AWS Tools For PowerShellを使用して、 ( Get-S3Objectを介して) バケット内のオブジェクトを一覧表示し、応答オブジェクトから共通のプレフィックスを取得できます。

以下は、サブディレクトリを再帰的に取得するための小さなライブラリです。

function Get-Subdirectories
{
  param
  (
    [string] $BucketName,
    [string] $KeyPrefix,
    [bool] $Recurse
  )

  @(get-s3object -BucketName $BucketName -KeyPrefix $KeyPrefix -Delimiter '/') | Out-Null

  if($AWSHistory.LastCommand.Responses.Last.CommonPrefixes.Count -eq 0)
  {
    return
  }

  $AWSHistory.LastCommand.Responses.Last.CommonPrefixes

  if($Recurse)
  {
    $AWSHistory.LastCommand.Responses.Last.CommonPrefixes | % { Get-Subdirectories -BucketName $BucketName -KeyPrefix $_ -Recurse $Recurse }
  }
}

function Get-S3Directories
{
  param
  (
    [string] $BucketName,
    [bool] $Recurse = $false
  )

  Get-Subdirectories -BucketName $BucketName -KeyPrefix '/' -Recurse $Recurse
}

この再帰関数は、反復ごとに KeyPrefix を更新して、渡された各 KeyPrefix 内のサブディレクトリをチェックすることに依存しています。区切り文字を に設定すると、区切り'/'文字が最初に出現する前に KeyPrefix 文字列に一致するキーが、$AWSHistory の最後の応答で CommonPrefixes コレクションにロールインされます。

S3 バケットの最上位ディレクトリのみを取得するには:

PS C:/> Get-S3Directories -BucketName 'myBucket'

S3 バケット内のすべてのディレクトリを取得するには:

PS C:/> Get-S3Directories -BucketName 'myBucket' -Recurse $true

これは文字列のコレクションを返します。各文字列は共通のプレフィックスです。

出力例:

myprefix/
myprefix/txt/
myprefix/img/
myotherprefix/
...
于 2016-04-22T22:04:58.577 に答える