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

问题描述 投票:0回答:10

假设我有一个名为

x.y.z

的 S3 存储桶

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

purple.gif
worksheet.xlsx

的文件

我可以从 AWS 命令行工具通过一次调用

rm
来执行此操作吗?

这没有用:

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

手册,您似乎无法按名称明确删除文件列表。有谁知道这样做的方法吗?我不想使用

--recursive
标志。

amazon-web-services amazon-s3 aws-cli
10个回答
134
投票

您可以通过多次提供

--exclude
--include
参数来做到这一点。但是,你必须使用
--recursive
才能工作。

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

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

在这里,除了 purple.gifworksheet.xlsx.

之外的所有文件都将从命令中排除

如果您不确定,请始终先尝试

--dryrun
并检查哪些文件将被删除。

来源:排除和包含过滤器的使用


35
投票

s3 rm
无法删除多个文件,但您可以使用
s3api delete-objects
在这里实现您想要的。

例子

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

14
投票

显然 aws s3 rm 仅适用于单个文件/对象。

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

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

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

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


8
投票

此命令删除存储桶中的文件。

aws s3 rm s3://buketname --recursive


2
投票

如果您使用的是 AWS CLI,您可以使用 grep regex 过滤 LS 结果并删除它们。例如

aws s3 ls s3://BUCKET | awk '{print $4}' | 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/%'

这很慢但有效


2
投票

可以使用

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

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

首先用

--dryrun
选项测试它!


1
投票

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

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/" $4'} | bash 

1
投票

我发现这个通过命令行很有用。我有超过 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

0
投票

在 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 $4}' | 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 次,因为有时,某些删除会失败...


-1
投票
aws s3 rm s3://<bucketname>/2023/ --recursive --exclude '*' --include 'A*.csv' 

上面的答案都没有提到如何使用通配符表达式选择多个文件并删除

如果您的用例是使用命名模式在 S3 中选择多个对象并删除,上述命令将很有用

© www.soinside.com 2019 - 2024. All rights reserved.