假设我有一个名为
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
标志。
您可以通过多次提供
--exclude
或 --include
参数来做到这一点。但是,你必须使用 --recursive
才能工作。
当有多个过滤器时,请记住过滤器参数的顺序很重要。规则是命令中稍后出现的过滤器优先于命令中较早出现的过滤器。
aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"
在这里,除了 purple.gif 和 worksheet.xlsx.
之外的所有文件都将从命令中排除如果您不确定,请始终先尝试
--dryrun
并检查哪些文件将被删除。
来源:排除和包含过滤器的使用
s3 rm
无法删除多个文件,但您可以使用s3api delete-objects
在这里实现您想要的。
例子
aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
显然 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”命令不会列出此类对象(截至撰写本文时)
此命令删除存储桶中的文件。
aws s3 rm s3://buketname --recursive
如果您使用的是 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/%'
这很慢但有效
您可以使用
aws s3 rm
删除多个文件。如果你想删除特定文件夹中的所有文件,只需使用
aws s3 rm --recursive --region <AWS_REGION> s3://<AWS_BUCKET>/<FOLDER_PATH>/
首先用
--dryrun
选项测试它!
当您想为对象名称指定通配符时,此解决方案将起作用。
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
我发现这个通过命令行很有用。我有超过 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 中删除非常大的文件夹的快速方法
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 次,因为有时,某些删除会失败...
aws s3 rm s3://<bucketname>/2023/ --recursive --exclude '*' --include 'A*.csv'
上面的答案都没有提到如何使用通配符表达式选择多个文件并删除
如果您的用例是使用命名模式在 S3 中选择多个对象并删除,上述命令将很有用