如何在S3中解压.zip和.gz文件并去重迁移至同桶新路径
S3批量解压压缩文件并去重迁移TXT文件方案
前置准备
- 确保已安装并配置AWS CLI:运行
aws configure,输入你的AWS访问密钥、区域等信息。 - 确认你的AWS身份拥有以下权限:
s3:GetObject、s3:PutObject、s3:ListBucket。
步骤1:收集已存在的TXT文件名(避免重复处理)
先把loc/路径下已有的TXT文件名单独提取出来,后续用来跳过对应压缩包的处理:
aws s3 ls s3://你的桶名/loc/ --recursive | grep "\.txt$" | awk '{print $4}' | sed 's/loc\///;s/\.txt$//' > existing_txts.txt
这条命令会生成一个existing_txts.txt文件,里面是所有已存在的TXT文件的核心名称(比如abcd)。
步骤2:处理ZIP压缩文件
创建一个bash脚本(比如process_zips.sh),内容如下,替换你的桶名为实际桶名:
#!/bin/bash BUCKET="你的桶名" # 遍历所有ZIP文件 aws s3 ls s3://$BUCKET/loc/ --recursive | grep "\.zip$" | awk '{print $4}' | while read ZIP_FILE; do # 提取核心文件名(去掉路径和.zip后缀) FILE_NAME=$(echo $ZIP_FILE | sed 's/loc\///;s/\.zip$//') # 检查该文件对应的TXT是否已存在,不存在则处理 if ! grep -q "^$FILE_NAME$" existing_txts.txt; then # 临时下载ZIP,解压后直接上传TXT到newloc,不保存本地TXT文件 aws s3 cp s3://$BUCKET/$ZIP_FILE ./temp.zip unzip -p temp.zip "$FILE_NAME.txt" | aws s3 cp - s3://$BUCKET/newloc/$FILE_NAME.txt # 删除临时ZIP文件 rm temp.zip fi done
给脚本添加执行权限并运行:
chmod +x process_zips.sh ./process_zips.sh
步骤3:处理GZ压缩文件
同理,创建process_gzs.sh脚本:
#!/bin/bash BUCKET="你的桶名" # 遍历所有GZ文件 aws s3 ls s3://$BUCKET/loc/ --recursive | grep "\.gz$" | awk '{print $4}' | while read GZ_FILE; do FILE_NAME=$(echo $GZ_FILE | sed 's/loc\///;s/\.gz$//') if ! grep -q "^$FILE_NAME$" existing_txts.txt; then aws s3 cp s3://$BUCKET/$GZ_FILE ./temp.gz gunzip -c temp.gz | aws s3 cp - s3://$BUCKET/newloc/$FILE_NAME.txt rm temp.gz fi done
添加权限并运行:
chmod +x process_gzs.sh ./process_gzs.sh
步骤4:迁移已有的TXT文件到newloc
把loc/下已存在的TXT文件复制到newloc/,用--no-clobber避免覆盖已上传的文件:
aws s3 cp s3://你的桶名/loc/ s3://你的桶名/newloc/ --recursive --exclude "*" --include "*.txt" --no-clobber
注意事项
- 本地磁盘占用:脚本通过管道直接上传解压后的内容,无需保存大体积TXT文件,仅临时存储压缩包,节省本地空间。
- 批量处理效率:800个大文件处理耗时较长,建议在后台运行脚本,比如
nohup ./process_zips.sh &,避免终端断开中断任务。 - 错误处理:如果需要记录错误,可以在脚本中添加日志输出,比如在循环内加入
echo "处理失败: $ZIP_FILE" >> error.log。
内容的提问来源于stack exchange,提问作者reemas
相关产品推荐
相关产品推荐

