Amazon web services 如何使用AWS CLI删除S3存储桶中的多个文件
假设我有一个名为Amazon web services 如何使用AWS CLI删除S3存储桶中的多个文件,amazon-web-services,amazon-s3,aws-cli,Amazon Web Services,Amazon S3,Aws Cli,假设我有一个名为x.y.z 在这个桶里,我有数百个文件。但我只想删除名为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标志。s3rm无法删除多个文件,
x.y.z
在这个桶里,我有数百个文件。但我只想删除名为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
标志。s3rm
无法删除多个文件,但您可以使用来实现您想要的功能
示例
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.gif和worksheet.xlsx之外,所有文件都将从命令中排除
如果您不确定,请务必先尝试--dryrun
,然后检查哪些文件将被删除
来源:通过命令行,我发现这个很有用。我有超过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仅适用于单个文件/对象 下面是一个bash命令,它构造各个delete命令,然后逐个删除对象。取得了一些成功(可能有点慢,但效果不错): 前两行用于构造“rm”命令,第三行(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/" $4'} | bash
如果您使用的是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-9a-zA-Z]*)''xargs-i%bash-c'aws s3 rm s3 s3://BUCKET/%
这很慢,但可以工作此命令删除存储桶中的文件。
aws s3 rm s3://buketname——递归的
在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'
AWS_PROFILE=AWS_BUCKET=AWS_FOLDER=;aws--profile$aws_profile s3ls“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 FOLDER}/%s}'”,$)],Quiet=true'>/dev 2>&1'
PS:这可能会启动2/3次,因为有时,某些删除操作会失败…注意,这也会删除子文件夹中与--include模式匹配的任何文件。虽然这可能不是原始提问者的最佳答案,但我很确定,我不是唯一一个在上搜索答案后来到这里的人“如何通过指定一个模式从一个bucket中删除多个文件”。谢谢!但我确实觉得有点可怕,我建议添加一个建议来尝试使用”--dryrun“参数。使这项工作真正‘递归地包含此文件夹中的所有内容’、‘排除所有内容’、‘包含我的选择’所需的所有参数中的逻辑是否都正确?”?是我还是这三重同义?(顺便说一句:这是AWS CLI的。)是的。使用类似于
aws s3 rm s3:///test folder/--include“*.txt”
之类的逻辑工具(对我来说)删除此目录中的所有文本文件没有任何效果。然后,aws s3 rm s3:///test folder/--recursive--include“*.txt”实际上会清除/test folder/
中的所有文件和子目录!你会认为它只需要.txt文件。。。嗯+1对于--试运行
这很有效,但是答案中的“你不能使用s3rm
”部分是不正确的。嗯,我想你的意思是jq
,而不是jQuery
。也许不是选美比赛的获胜者,但是,嘿-这很有效,如果你不直接去bash,它会给你一个机会重新审视你的“删除计划”。谢谢它会删除哪些文件?你能举一个只删除两个文件的例子吗?aws s3 ls——递归BUCKET_NAME | grep PATTERN_TO_DELETE | awk'{print“aws s3 rm s3://BUCKET_NAME/“$4}”| bash
你可以在删除之前通过删除| bash
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'