如何从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
相关产品推荐
相关产品推荐

