如何使用 AWS CLI 删除 S3 存储桶中的多个文件

How to delete multiple files in S3 bucket with AWS CLI

假设我有一个名为 x.y.z

的 S3 存储桶

在这个桶中,我有数百个文件。但我只想删除 2 个名为 purple.gifworksheet.xlsx

的文件

我可以通过调用 rm 从 AWS 命令​​行工具执行此操作吗?

这没有用:

$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif
Unknown options: s3://x.y.z/purple.gif

manual 来看,您似乎无法按名称明确删除文件列表。有谁知道这样做的方法吗?我不喜欢使用 --recursive 标志。

s3 rm不能删除多个文件,但是你可以用s3api delete-objects在这里实现你想要的。

例子

aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'

您可以通过多次提供 --exclude--include 参数来实现。但是,您必须使用 --recursive 才能正常工作。

当有多个过滤器时,请记住过滤器参数的顺序很重要。规则是在命令中较晚出现的过滤器优先于在命令中较早出现的过滤器。

aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"

这里,除了purple.gifworksheet.xlsx之外的所有文件都会被命令排除。

如果您不确定,请始终先尝试 --dryrun 并检查哪些文件将被删除。

来源:Use of Exclude and Include Filters

我发现这个通过命令行很有用。我有超过 400 万个文件,清空桶花了将近一周的时间。这很方便,因为 AWS 控制台没有描述日志。

注意:您需要安装 jq 工具。

 aws s3api list-object-versions --bucket YOURBUCKETNAMEHERE-processed \
     --output json --query 'Versions[].[Key, VersionId]' \
     | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' \
     | xargs -L1 aws s3api delete-object --bucket YOURBUCKETNAMEHERE

显然 aws s3 rm 仅适用于个人 files/objects。

下面是一个bash命令,它构造了单独的删除命令,然后一个一个地删除对象。取得了一些成功(可能有点慢,但有效):

aws s3 ls s3://bucketname/foldername/ | 
awk {'print "aws s3 rm s3://bucketname/foldername/" '} | 
bash

前两行用于构造“rm”命令,第 3 行 (bash) 将执行它们。

请注意,如果您的对象名称包含空格或有趣的字符,您可能会遇到问题。这是因为“aws s3 ls”命令不会列出此类对象(截至撰写本文时)

当您要为对象名称指定通配符时,此解决方案将起作用。

aws s3 ls dmap-live-dwh-files/backup/mongodb/oms_api/hourly/ | grep order_2019_08_09_* | awk {'print "aws s3 rm s3://dmap-live-dwh-files/backup/mongodb/oms_api/hourly/" '} | bash 

如果您使用的是 AWS CLI,则可以使用 grep regex 筛选 LS 结果并将其删除。例如

aws s3 ls s3://BUCKET | awk '{print }' | grep -E -i '^2015-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9a-zA-Z]*)' | xargs -I% bash -c 'aws s3 rm s3://BUCKET/%'

这很慢但有效

此命令删除存储桶中的文件。
aws s3 rm s3://buketname --recursive

在 AWS 中删除超大文件夹的快速方法

AWS_PROFILE=<AWS_PROFILE> AWS_BUCKET=<AWS_BUCKET> AWS_FOLDER=<AWS_FOLDER>; aws --profile $AWS_PROFILE s3 ls "s3://${AWS_BUCKET}/${AWS_FOLDER}/" | awk '{print }' | xargs -P8 -n1000 bash -c 'aws --profile '${AWS_PROFILE}' s3api delete-objects --bucket '${AWS_BUCKET}' --delete "Objects=[$(printf "{Key='${AWS_FOLDER}'/%s}," "$@")],Quiet=true" >/dev/null 2>&1'

PS:这可能会启动 2/3 次,因为有时某些删除会失败...

可以使用aws s3 rm删除多个文件。如果要删除特定文件夹中的所有文件,只需使用

aws s3 rm --recursive --region <AWS_REGION> s3://<AWS_BUCKET>/<FOLDER_PATH>/

首先使用 --dryrun 选项对其进行测试!