快速找到 S3 的大小 'folder'

Quickly finding the size of an S3 'folder'

我们有 s3 'folders'(存储桶下带有前缀的对象),其中包含数百万个文件,我们想计算出这些文件夹的大小。

编写我自己的 .net 应用程序来获取 s3 对象的列表非常简单,但是每个请求的最大键数是 1000,所以要花很长时间。

使用 S3Browser 查看“文件夹”的属性也需要很长时间。我猜出于同样的原因。

我已经使用这个 .NET 应用程序 运行 一周了 - 我需要一个更好的解决方案。

有更快的方法吗?

如果他们限制了你每个请求 1000 个密钥,我不确定 PowerShell 将如何提供帮助,但如果你想调整一堆文件夹的大小,应该这样做。

将以下内容保存在名为 Get-FolderSize 的文件中。ps1:

param
(
    [Parameter(Position=0, ValueFromPipeline=$True, Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [System.String]
    $Path
)

function Get-FolderSize ($_ = (get-item .))  {
  Process {
    $ErrorActionPreference = "SilentlyContinue"
    #? { $_.FullName -notmatch "\email\?" }  <-- Exlcude folders.
    $length = (Get-ChildItem $_.fullname -recurse | Measure-Object -property length -sum).sum
    $obj = New-Object PSObject
    $obj | Add-Member NoteProperty Folder ($_.FullName)
    $obj | Add-Member NoteProperty Length ($length)
     Write-Output $obj
  }
}

Function Class-Size($size)
{

    IF($size -ge 1GB)
    {
        "{0:n2}" -f  ($size / 1GB) + " GB"
    }
    ELSEIF($size -ge 1MB)
    {
        "{0:n2}" -f  ($size / 1MB) + " MB"
    }
    ELSE
    {
        "{0:n2}" -f  ($size / 1KB) + " KB"
    }
}

Get-ChildItem $Path | Get-FolderSize | Sort-Object -Property Length -Descending | Select-Object -Property Folder, Length | Format-Table -Property Folder, @{ Label="Size of Folder" ; Expression = {Class-Size($_.Length)} }

用法:.\Get-FolderSize.ps1 -Path \path\to\your\folders

我认为理想的解决方案不存在。但我提供了一些您可以进一步发展的想法:

  1. 应用程序是将文件写入 S3 的唯一方式吗?如果是这样,您可以存储(在数据库、文件或其他任何东西中)文件大小并在必要时对其求和
  2. 并发调用 LIST api
  3. 您能否从基于文件夹的组织切换到基于存储桶的组织?如果是这样,您可以查询账单 API(是的,账单)并根据成本计算大小(或近似值)...

AWS CLI's ls command可以做到这一点:aws s3 ls --summarize --human-readable --recursive s3://$BUCKETNAME/$PREFIX --region $REGION

似乎 AWS 添加了一个可以看到大小的菜单项:

我更喜欢使用 AWSCLI。我发现当对象太多时,Web 控制台经常超时。

  • 将 s3://bucket/ 替换为您要开始的位置。
  • 依赖于 awscli、awk、tail 和一些 bash-like shell
start=s3://bucket/ && \
for prefix in `aws s3 ls $start | awk '{print }'`; do
  echo ">>> $prefix <<<"
  aws s3 ls $start$prefix --recursive --summarize | tail -n2
done

或单行形式:

start=s3://bucket/ && for prefix in `aws s3 ls $start | awk '{print }'`; do echo ">>> $prefix <<<"; aws s3 ls $start$prefix --recursive --summarize | tail -n2; done

输出类似于:

$ start=s3://bucket/ && for prefix in `aws s3 ls $start | awk '{print }'`; do echo ">>> $prefix <<<"; aws s3 ls $start$prefix --recursive --summarize | tail -n2; done
>>> extracts/ <<<
Total Objects: 23
   Total Size: 10633858646
>>> hackathon/ <<<
Total Objects: 2
   Total Size: 10004
>>> home/ <<<
Total Objects: 102
   Total Size: 1421736087