You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从S3存储桶下载含Windows不兼容文件名的所有文件?

解决Windows下AWS S3复制带冒号路径文件失败的问题

我刚踩过一模一样的坑!你完全猜对了——Windows的NTFS文件系统不允许文件名或文件夹名包含冒号(:),这就是为什么aws s3 cp s3://mybucket . --recursive只能创建logs/2018-03-20这类上层空目录,却没法把那些带01:00+00路径的文件下载下来。

下面给你两个可行的解决方案,根据你的AWS CLI版本选就行:

方案1:用AWS CLI v2的--rename参数(推荐)

如果你已经升级到AWS CLI v2.11.0及以上版本,直接用--rename参数替换路径里的冒号为合法字符(比如下划线)就行,这是最简单的方法:

aws s3 cp s3://mybucket . --recursive --rename "s/:/_/g"

这个命令会把所有S3对象路径中的冒号(:)全局替换成下划线(_),Windows就能正常创建目录和保存文件了。比如原来的01:00+00会变成01_00+00,文件名里的01:10:06.521.csv.gz会变成01_10_06.521.csv.gz。

方案2:旧版CLI用PowerShell脚本手动处理

如果你的AWS CLI版本比较旧,不支持--rename,可以用PowerShell写个小脚本遍历所有S3对象,手动修正路径后下载:

# 获取S3桶内logs目录下的所有对象键
$objects = aws s3 ls s3://mybucket/logs/ --recursive | ForEach-Object {
    $splitParts = $_ -split "\s+"
    $objectKey = $splitParts[-1]
    return $objectKey
}

# 逐个处理并下载文件
foreach ($key in $objects) {
    # 把路径里的冒号替换成下划线
    $localFilePath = $key -replace ":", "_"
    # 创建本地目录(如果不存在)
    $localDir = Split-Path $localFilePath -Parent
    if (-not (Test-Path $localDir)) {
        New-Item -ItemType Directory -Path $localDir | Out-Null
    }
    # 执行下载
    aws s3 cp "s3://mybucket/$key" "$localFilePath"
}

这个脚本会先列出所有需要下载的对象,然后逐个修正路径中的非法字符,创建对应的本地目录后再下载文件。

额外注意事项

  • 优先升级AWS CLI到v2最新版,--rename参数能省很多事,直接下载对应Windows安装包即可完成升级。
  • 替换字符时尽量选Windows允许的(比如_、-、.),避免再次触发非法字符错误。
  • 可以先测试单个文件的下载,比如:
    aws s3 cp s3://mybucket/logs/2018-03-20/01:00+00/01:10:06.521.csv.gz ./logs/2018-03-20/01_00+00/01_10_06.521.csv.gz
    
    确认没问题后再批量处理。

内容的提问来源于stack exchange,提问作者Karl Bishop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:52:11