2016-04-22 55 views
2

PowerShellを使ってS3バケットから "フォルダ"のリストを取得する方法はありますか?すべてのオブジェクトを1つリストしたり、別々のパスのコンパイル済みリストをスクリプト化したりする必要はありません。私が働いているバケツには何十万もの個々のオブジェクトがあり、それは非常に長い時間がかかります。AWS用PowerShell:S3バケットから「フォルダ」のみを一覧表示しますか?

これは本当にばかげた質問ですが、その場合は申し訳ありませんが、GoogleやSOにはこれに答えられるものが見つかりませんでした。私は、-KeyPrefixとGet-S3Objectの-Key paramsにワイルドカードを追加してみました。それは私が後にしていることをすることができるように思われる唯一のコマンドレットです。

ポイントレスバックストーリー:私は、正しい、既存のフォルダにファイルを転送していることを確認したいだけです。私は契約しているサードパーティーなので、コンソールへのログインアクセスはなく、私はAWSアカウントを管理する人ではありません。

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

ありがとうございます。

答えて

1

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' 

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

どこ各これは、文字列のコレクションを返しますS3バケットで唯一のトップレベルのディレクトリを取得するために

stringは共通の接頭辞です。

出力例:

myprefix/ 
myprefix/txt/ 
myprefix/img/ 
myotherprefix/ 
... 
0
$objects = Get-S3Object -BucketName $bucketname -ProfileName $profilename -Region $region 
[email protected]() 
foreach($object in $objects) 
{ 
    $path = split-path $object.Key -Parent 
    $paths += $path 
} 
$paths = $paths | select -Unique 
write-host "`nNumber of folders "$paths.count"" 
Write-host "$([string]::join("`n",$paths)) " 
関連する問題