2015-05-29 31 views
2

下面的腳本複製文件夾結構中的所有文件,然後將它們粘貼到S3存儲桶。不過,我希望它能夠跳過自上次上載以來尚未更改的文件,以避免重複上傳。有誰知道我可以如果文件存在檢查或上次修改?如何識別已經上傳到S3的本地文件,並且從那時起沒有更改過?

Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1" 
$bucket="bucketname" 
$source="e:\dfs\*" 
$outputpath="C:\temp\log.txt" 
$AKey="xxxx" 
$SKey="xxxx" 

Set-AWSCredentials -AccessKey $AKey -SecretKey $SKey -StoreAs For_Move 
Initialize-AWSDefaults -ProfileName For_Move -Region eu-west-1 

Start-Transcript -path $outputpath -Force 
foreach ($i in Get-ChildItem $source -include *.* -recurse) 
{ 
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-0))) 
    { 
     $fileName = (Get-ChildItem $i).Name 
     $parentFolderName = Split-Path $i -Parent 

     Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
    } 
} 
+1

爲什麼不使用同步選項? http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html –

+0

我會看看這個選項。謝謝 –

+0

啊,我想知道爲什麼沒有「noclobber」(或類似的)參數。這解釋了它! –

回答

2

對於一個非常基本的「文件存在嗎?」您可以在相同的位置使用Get-S3Object,並在嘗試上載之前測試每個文件。

if (!(Get-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename)) { 
    Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
} 

更改的日期相較於上次上傳稍微複雜一些,但你可以使用測試更像是:

$localModified = (Get-ItemProperty -Path $fileName).LastWriteTime 
$s3Modified = (Get-S3Object -BucketName $bucket -Key $file -Region us-east-1).LastModified | Get-Date 

if ($s3Modified -lt $localModified) { 
    Write-S3Object -BucketName $bucket -Key dfs/$parentFolderName/$filename -File $i 
} 
+0

謝謝!我現在的問題是上傳到S3的對象會更改它們的日期,因此比較它們會失敗。也許S3不是像這樣最好的備份解決方案。考慮到可能使用時間標記標記S3對象元數據。似乎過於複雜,雖然 –

+1

當你說「讓他們的日期改變」,你是什麼意思?即使上傳日期高於上次本地寫入時間,仍然表明它需要重新上傳,對吧? –

1

把這些一起我有以下幾點:

Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1" 
$bucket="<my bucket name>" 
$source="C:\dev\project\*" 
$outputpath="C:\dev\log.txt" 
$AKey="<key>" 
$SKey="<secret>" 
$region="<my AWS region>" 

Set-AWSCredentials -AccessKey $AKey -SecretKey $SKey -StoreAs For_Move 
Initialize-AWSDefaults -ProfileName For_Move -Region $region 

Start-Transcript -path $outputpath -Force 
foreach ($i in Get-ChildItem $source -include *.* -recurse) 
{ 
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-0))) 
    { 
     $fileName = (Get-ChildItem $i).Name 
     $parentFolderName = Split-Path $i -Parent 
     $key = "$i" 

     $localModified = (Get-ItemProperty -Path $i).LastWriteTime 
     $remoteObject = Get-S3Object -BucketName $bucket -Key $key -Region $region 
     if($remoteObject -eq $null) { 
      Write-S3Object -BucketName $bucket -Key $key -File $i 
      "Added new file $i" 
     } else { 

      $s3Modified = $remoteObject.LastModified | Get-Date 

      if ($s3Modified -lt $localModified) { 
       Write-S3Object -BucketName $bucket -Key $key -File $i 
       "Updated $i" 
      } 
     } 
    } 
} 

注意:這是我寫過的第一個Powershell腳本 - 如果我的風格和方法錯誤,請原諒我。

相關問題