快速找到 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
我认为理想的解决方案不存在。但我提供了一些您可以进一步发展的想法:
- 应用程序是将文件写入 S3 的唯一方式吗?如果是这样,您可以存储(在数据库、文件或其他任何东西中)文件大小并在必要时对其求和
- 并发调用 LIST api
- 您能否从基于文件夹的组织切换到基于存储桶的组织?如果是这样,您可以查询账单 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
我们有 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
我认为理想的解决方案不存在。但我提供了一些您可以进一步发展的想法:
- 应用程序是将文件写入 S3 的唯一方式吗?如果是这样,您可以存储(在数据库、文件或其他任何东西中)文件大小并在必要时对其求和
- 并发调用 LIST api
- 您能否从基于文件夹的组织切换到基于存储桶的组织?如果是这样,您可以查询账单 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