Amazon web services 使用cli根据文件中列出的名称从s3存储桶中删除文件

Amazon web services 使用cli根据文件中列出的名称从s3存储桶中删除文件,amazon-web-services,amazon-s3,command-line-interface,Amazon Web Services,Amazon S3,Command Line Interface,我试图从AmazonS3 bucket中删除多个(比如:数千个)文件。 我在文件中列出了一个文件名,如下所示: name1.jpg name2.jpg ... name2020201.jpg 我尝试了以下解决方案: aws s3 rm s3://test-bucket --recursive --exclude "*" --include "data/*.*" from-but--include只接受一个参数。 我试着用hacky来列出名字,比如——

我试图从AmazonS3 bucket中删除多个(比如:数千个)文件。 我在文件中列出了一个文件名,如下所示:

name1.jpg
name2.jpg
...
name2020201.jpg
我尝试了以下解决方案:

aws s3 rm s3://test-bucket --recursive --exclude "*" --include "data/*.*" 
from-but--include只接受一个参数。 我试着用hacky来列出名字,比如
——包括“name1.jpg”
,但这也不起作用

这种方法也不起作用:

aws s3 rm s3://test-bucket < file.txt
aws s3 rm s3://test bucket

你能帮忙吗?

我用这个简单的bash脚本解决了这个问题:

#!/bin/bash  
set -e  
while read line  
do  
   aws s3 rm s3://test-bucket/$line
done <files.txt
#/bin/bash
set-e
读行时
做
aws s3 rm s3://测试桶/$行

完成以下方法实际上要快得多,因为我的第一个答案花了很长时间才完成

我的第一种方法是使用
rm
命令一次删除一行。这是没有效率的。大约15小时后(!)它只删除了大约40000条记录,占总数的1/5

由诺伯特·普雷宁所作,速度更快。正如他所解释的,它使用名为删除对象的s3api方法,可以批量删除存储中的对象。此方法将json对象作为参数。要将文件名列表解析为所需的JSON对象,此脚本使用名为jq()的JSON预处理器。该脚本每次迭代需要500条记录

cat file-with-names |  while mapfile -t -n 500 ary && ((${#ary[@]})); do
        objdef=$(printf '%s\n' "${ary[@]}" | ./jq-win64.exe -nR '{Objects: (reduce inputs as $line ([]; . + [{"Key":$line}]))}')
        aws s3api --no-cli-pager  delete-objects --bucket BUKET --delete "$objdef"
done

您是否尝试过这个
aws s3 rm s3://测试桶--递归--排除“*”--包括“data/*.jpg”
是的,实际上我没有“=”符号,这是正确的,我会修复它。但这个例子并不能解决问题,答案是肯定的