2016-04-22 12 views
2

Gibt es eine einfache Möglichkeit, PowerShell zu verwenden, um nur eine Liste von "Ordnern" aus einem S3-Bucket abzurufen, ohne jedes einzelne Objekt aufzulisten und nur eine kompilierte Liste eindeutiger Pfade zu scripten? Es gibt Hunderttausende von einzelnen Objekten in dem Eimer, in dem ich arbeite, und das würde sehr lange dauern.PowerShell für AWS: Nur "Ordner" aus S3-Bucket auflisten?

Es ist möglich, dass dies eine wirklich dumme Frage ist und es tut mir leid, wenn das der Fall ist, aber ich konnte nichts auf Google oder SO finden, um dies zu beantworten. Ich habe versucht, Platzhalter zu-KeyPrefix und -Key Params von Get-S3Object vergebens zu verwenden. Das ist das einzige Cmdlet, das so aussieht, als könnte es das tun, wonach ich suche.

Sinnlose Hintergrundgeschichte: Ich möchte nur sicherstellen, dass ich Dateien in die richtigen, vorhandenen Ordner übertrage. Ich bin eine vertraglich gebundene Drittpartei, daher habe ich keinen Zugang zur Konsolenanmeldung und bin nicht die Person, die den AWS-Account verwaltet.

Ich weiß, dass dies mit Java und C# und anderen möglich ist, aber ich mache alles andere mit diesem ziemlich einfachen Projekt in PS und hoffte, in der Lage zu sein, dabei zu bleiben.

Vielen Dank im Voraus.

Antwort

1

Sie können die AWS Tools For PowerShell verwenden, um Objekte (über Get-S3Object) im Bucket aufzulisten und allgemeine Präfixe aus dem Antwortobjekt zu ziehen.

Im Folgenden finden Sie eine kleine Bibliothek rekursiv Verzeichnisse abrufen:

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 
} 

Diese rekursive Funktion ist abhängig von jeder Iteration die KeyPrefix auf die Aktualisierung für Verzeichnisse zu prüfen, in jeder KeyPrefix an sie übergeben. Durch Festlegen des Trennzeichens als '/' werden Schlüssel, die mit der KeyPrefix-Zeichenfolge vor dem ersten Auftreten des Trennzeichens übereinstimmen, in der letzten Antwort von $ AWSHistory in die CommonPrefixes-Auflistung gerollt.

Um nur die Top-Level-Verzeichnisse in einem S3-Bucket abrufen:

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

Um alle Verzeichnisse in einem S3-Bucket abrufen:

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

Dieses eine Sammlung von Strings zurück, wobei jeder Zeichenfolge ist ein gemeinsames Präfix.

Ausgabe:

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)) " 
Verwandte Themen