Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何使用AWS CLI删除S3存储桶中的多个文件_Amazon Web Services_Amazon S3_Aws Cli - Fatal编程技术网

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.gifworksheet.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'