如何用AWS CLI批量复制并重命名S3存储桶中的10yr文件?
解决AWS S3批量复制并重命名文件的问题
错误原因分析
你之前的命令存在两个核心问题:
- 不能用本地
find命令遍历S3文件:S3是对象存储,并非本地文件系统,find .只能检索本地文件,无法访问S3存储桶内的内容。 - for循环语法错误:缺少
do关键字,且变量拼接逻辑错误($iyr会被Shell识别为名为iyr的变量,而非i与yr的拼接)。
正确命令写法
以下两种方法适合新手操作,任选其一即可:
方法1:用aws s3 ls遍历文件(直观易理解)
# 筛选存储桶中所有包含"10yr"的文件路径 for file in $(aws s3 ls s3://mybucket/ --recursive | grep "10yr" | awk '{print $4}'); do # 循环生成1-10yr的文件副本 for i in {1..10}; do # 替换文件名中的"10yr"为"{i}yr" new_file="${file/10yr/${i}yr}" # 执行复制操作(可先加--dryrun参数测试命令正确性) aws s3 cp "s3://mybucket/${file}" "s3://mybucket/${new_file}" done done
方法2:用aws s3api批量获取文件(适合大量文件场景)
# 批量获取存储桶内所有带"10yr"的文件路径 files=$(aws s3api list-objects-v2 --bucket mybucket --query "Contents[?contains(Key, '10yr')].Key" --output text) # 遍历每个文件生成对应副本 for file in $files; do for i in {1..10}; do new_file="${file/10yr/${i}yr}" aws s3 cp "s3://mybucket/${file}" "s3://mybucket/${new_file}" done done
注意事项
- 先确认AWS CLI已配置好访问目标存储桶的权限,可通过
aws s3 ls s3://mybucket/验证。 - 测试阶段可在
aws s3 cp后添加--dryrun参数,此时不会实际复制文件,仅输出待执行的命令,确认无误后再移除该参数。
内容的提问来源于stack exchange,提问作者byc
相关产品推荐
相关产品推荐

