2016-04-22 111 views
2

是否有任何簡單的方法可以使用PowerShell從S3存儲桶中只獲取「文件夾」列表,而不列出每個對象,只編寫不同路徑的編譯列表?我工作的桶中有成千上萬的單個物體,而且這需要很長時間。適用於AWS的PowerShell:僅列出S3存儲桶中的「文件夾」?

這可能是一個非常愚蠢的問題,我很抱歉,如果是這樣,但我無法在Google或SO上找到任何答案來回答這個問題。我嘗試添加通配符到-KeyPrefix和Get-S3Object的-Key params無濟於事。這是唯一一個看起來像是可以做我以後的事情的cmdlet。

毫無意義的背景故事:我只是想確保將文件傳輸到正確的現有文件夾。我是簽約的第三方,所以我沒有控制檯登錄訪問權限,我也不是維護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' 

要檢索的所有目錄中的S3鬥:

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

這將返回一個字符串的集合,其中每個字符串是一個通用的前綴。

示例輸出:

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)) " 
相關問題